Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Administration / ContractInstanceProvider.cs / 3 / ContractInstanceProvider.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.ServiceModel.Administration
{
using System;
using System.ServiceModel.Description;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.ServiceModel.Channels;
class ContractInstanceProvider : ProviderBase, IWmiProvider
{
static Dictionary knownContracts = new Dictionary();
internal static string ContractReference(string contractName)
{
return String.Format(CultureInfo.InvariantCulture,
AdministrationStrings.Contract +
"." +
AdministrationStrings.Name +
"='{0}'," +
AdministrationStrings.ProcessId +
"={1}," +
AdministrationStrings.AppDomainId +
"={2}",
contractName,
AppDomainInfo.Current.ProcessId,
AppDomainInfo.Current.Id);
}
internal static void RegisterContract(ContractDescription contract)
{
lock (ContractInstanceProvider.knownContracts)
{
if (!ContractInstanceProvider.knownContracts.ContainsKey(contract.Name))
{
ContractInstanceProvider.knownContracts.Add(contract.Name, contract);
}
}
}
static void FillContract(IWmiInstance contract, ContractDescription contractDescription)
{
DiagnosticUtility.DebugAssert(null != contractDescription, "contractDescription cannot be null");
contract.SetProperty(AdministrationStrings.Type, contractDescription.ContractType.Name);
if (null != contractDescription.CallbackContractType)
{
contract.SetProperty(AdministrationStrings.CallbackContract, ContractReference(contractDescription.CallbackContractType.Name));
}
contract.SetProperty(AdministrationStrings.Name, contractDescription.Name);
contract.SetProperty(AdministrationStrings.Namespace, contractDescription.Namespace);
contract.SetProperty(AdministrationStrings.SessionMode, contractDescription.SessionMode.ToString());
IWmiInstance[] operations = new IWmiInstance[contractDescription.Operations.Count];
for (int j = 0; j < operations.Length; ++j)
{
OperationDescription operationDescription = contractDescription.Operations[j];
Debug.Assert(operationDescription.Messages.Count > 0);
IWmiInstance operation = contract.NewInstance(AdministrationStrings.Operation);
FillOperation(operation, operationDescription);
operations[j] = operation;
}
contract.SetProperty(AdministrationStrings.Operations, operations);
FillBehaviorsInfo(contract, contractDescription.Behaviors);
}
private static void FillOperation(IWmiInstance operation, OperationDescription operationDescription)
{
operation.SetProperty(AdministrationStrings.Name, operationDescription.Name);
operation.SetProperty(AdministrationStrings.Action, FixWildcardAction(operationDescription.Messages[0].Action));
if (operationDescription.Messages.Count > 1)
{
operation.SetProperty(AdministrationStrings.ReplyAction, FixWildcardAction(operationDescription.Messages[1].Action));
}
operation.SetProperty(AdministrationStrings.IsOneWay, operationDescription.IsOneWay);
operation.SetProperty(AdministrationStrings.IsInitiating, operationDescription.IsInitiating);
operation.SetProperty(AdministrationStrings.IsTerminating, operationDescription.IsTerminating);
operation.SetProperty(AdministrationStrings.AsyncPattern, null != operationDescription.BeginMethod);
if (null != operationDescription.SyncMethod)
{
if (null != operationDescription.SyncMethod.ReturnType)
{
operation.SetProperty(AdministrationStrings.ReturnType, operationDescription.SyncMethod.ReturnType.Name);
}
operation.SetProperty(AdministrationStrings.MethodSignature, operationDescription.SyncMethod.ToString());
ParameterInfo[] parameterInfo = operationDescription.SyncMethod.GetParameters();
string[] parameterTypes = new string[parameterInfo.Length];
for (int i = 0; i < parameterInfo.Length; i++)
{
parameterTypes[i] = parameterInfo[i].ParameterType.ToString();
}
operation.SetProperty(AdministrationStrings.ParameterTypes, parameterTypes);
}
operation.SetProperty(AdministrationStrings.IsCallback, operationDescription.Messages[0].Direction == MessageDirection.Output);
FillBehaviorsInfo(operation, operationDescription.Behaviors);
}
static void FillBehaviorsInfo(IWmiInstance operation, KeyedByTypeCollection behaviors)
{
List behaviorInstances = new List(behaviors.Count);
foreach (IOperationBehavior behavior in behaviors)
{
IWmiInstance behaviorInstance;
FillBehaviorInfo(behavior, operation, out behaviorInstance);
if (null != behaviorInstance)
{
behaviorInstances.Add(behaviorInstance);
}
}
operation.SetProperty(AdministrationStrings.Behaviors, behaviorInstances.ToArray());
}
static void FillBehaviorsInfo(IWmiInstance operation, KeyedByTypeCollection behaviors)
{
List behaviorInstances = new List(behaviors.Count);
foreach (IContractBehavior behavior in behaviors)
{
IWmiInstance behaviorInstance;
FillBehaviorInfo(behavior, operation, out behaviorInstance);
if (null != behaviorInstance)
{
behaviorInstances.Add(behaviorInstance);
}
}
operation.SetProperty(AdministrationStrings.Behaviors, behaviorInstances.ToArray());
}
static void FillBehaviorInfo(IContractBehavior behavior, IWmiInstance existingInstance, out IWmiInstance instance)
{
DiagnosticUtility.DebugAssert(null != existingInstance, "");
DiagnosticUtility.DebugAssert(null != behavior, "");
instance = null;
if (behavior is DeliveryRequirementsAttribute)
{
instance = existingInstance.NewInstance("DeliveryRequirementsAttribute");
DeliveryRequirementsAttribute specificBehavior = (DeliveryRequirementsAttribute)behavior;
instance.SetProperty(AdministrationStrings.QueuedDeliveryRequirements, specificBehavior.QueuedDeliveryRequirements.ToString());
instance.SetProperty(AdministrationStrings.RequireOrderedDelivery, specificBehavior.RequireOrderedDelivery);
if (null != specificBehavior.TargetContract)
{
instance.SetProperty(AdministrationStrings.TargetContract, specificBehavior.TargetContract.ToString());
}
}
else if (behavior is IWmiInstanceProvider)
{
IWmiInstanceProvider instanceProvider = (IWmiInstanceProvider)behavior;
instance = existingInstance.NewInstance(instanceProvider.GetInstanceType());
instanceProvider.FillInstance(instance);
}
else
{
instance = existingInstance.NewInstance("Behavior");
}
if (null != instance)
{
instance.SetProperty(AdministrationStrings.Type, behavior.GetType().FullName);
}
}
static void FillBehaviorInfo(IOperationBehavior behavior, IWmiInstance existingInstance, out IWmiInstance instance)
{
DiagnosticUtility.DebugAssert(null != existingInstance, "");
DiagnosticUtility.DebugAssert(null != behavior, "");
instance = null;
if (behavior is DataContractSerializerOperationBehavior)
{
instance = existingInstance.NewInstance("DataContractSerializerOperationBehavior");
DataContractSerializerOperationBehavior specificBehavior = (DataContractSerializerOperationBehavior)behavior;
instance.SetProperty(AdministrationStrings.IgnoreExtensionDataObject, specificBehavior.IgnoreExtensionDataObject);
instance.SetProperty(AdministrationStrings.MaxItemsInObjectGraph, specificBehavior.MaxItemsInObjectGraph);
if (null != specificBehavior.DataContractFormatAttribute)
{
instance.SetProperty(AdministrationStrings.Style, specificBehavior.DataContractFormatAttribute.Style.ToString());
}
}
else if (behavior is OperationBehaviorAttribute)
{
instance = existingInstance.NewInstance("OperationBehaviorAttribute");
OperationBehaviorAttribute specificBehavior = (OperationBehaviorAttribute)behavior;
instance.SetProperty(AdministrationStrings.AutoDisposeParameters, specificBehavior.AutoDisposeParameters);
instance.SetProperty(AdministrationStrings.Impersonation, specificBehavior.Impersonation.ToString());
instance.SetProperty(AdministrationStrings.ReleaseInstanceMode, specificBehavior.ReleaseInstanceMode.ToString());
instance.SetProperty(AdministrationStrings.TransactionAutoComplete, specificBehavior.TransactionAutoComplete);
instance.SetProperty(AdministrationStrings.TransactionScopeRequired, specificBehavior.TransactionScopeRequired);
}
else if (behavior is TransactionFlowAttribute)
{
instance = existingInstance.NewInstance("TransactionFlowAttribute");
TransactionFlowAttribute specificBehavior = (TransactionFlowAttribute)behavior;
instance.SetProperty(AdministrationStrings.TransactionFlowOption, specificBehavior.Transactions.ToString());
}
else if (behavior is XmlSerializerOperationBehavior)
{
instance = existingInstance.NewInstance("XmlSerializerOperationBehavior");
XmlSerializerOperationBehavior specificBehavior = (XmlSerializerOperationBehavior)behavior;
if (null != specificBehavior.XmlSerializerFormatAttribute)
{
instance.SetProperty(AdministrationStrings.Style, specificBehavior.XmlSerializerFormatAttribute.Style.ToString());
instance.SetProperty(AdministrationStrings.Use, specificBehavior.XmlSerializerFormatAttribute.Use.ToString());
instance.SetProperty(AdministrationStrings.SupportFaults, specificBehavior.XmlSerializerFormatAttribute.SupportFaults.ToString());
}
}
else if (behavior is IWmiInstanceProvider)
{
IWmiInstanceProvider instanceProvider = (IWmiInstanceProvider)behavior;
instance = existingInstance.NewInstance(instanceProvider.GetInstanceType());
instanceProvider.FillInstance(instance);
}
else
{
instance = existingInstance.NewInstance("Behavior");
}
if (null != instance)
{
instance.SetProperty(AdministrationStrings.Type, behavior.GetType().FullName);
}
}
static string FixWildcardAction(string action)
{
#pragma warning suppress 56507
return null != action ? action : MessageHeaders.WildcardAction;
}
static void UpdateContracts()
{
foreach (ServiceInfo info in new ServiceInfoCollection(ManagementExtension.Services))
{
foreach (EndpointInfo endpointInfo in info.Endpoints)
{
ContractInstanceProvider.RegisterContract(endpointInfo.Contract);
}
}
}
void IWmiProvider.EnumInstances(IWmiInstances instances)
{
DiagnosticUtility.DebugAssert(null != instances, "");
int processId = AppDomainInfo.Current.ProcessId;
int appDomainId = AppDomainInfo.Current.Id;
lock (ContractInstanceProvider.knownContracts)
{
UpdateContracts();
foreach (ContractDescription contract in ContractInstanceProvider.knownContracts.Values)
{
IWmiInstance instance = instances.NewInstance(null);
instance.SetProperty(AdministrationStrings.ProcessId, processId);
instance.SetProperty(AdministrationStrings.AppDomainId, appDomainId);
FillContract(instance, contract);
instances.AddInstance(instance);
}
}
}
bool IWmiProvider.GetInstance(IWmiInstance contract)
{
DiagnosticUtility.DebugAssert(null != contract, "");
bool bFound = false;
if ((int)contract.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId
&& (int)contract.GetProperty(AdministrationStrings.AppDomainId) == AppDomainInfo.Current.Id)
{
string contractName = (string)contract.GetProperty(AdministrationStrings.Name);
ContractDescription contractDescription;
UpdateContracts();
if (ContractInstanceProvider.knownContracts.TryGetValue(contractName, out contractDescription))
{
bFound = true;
FillContract(contract, contractDescription);
}
}
return bFound;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UpdatePanel.cs
- IfJoinedCondition.cs
- RelativeSource.cs
- ViewValidator.cs
- StreamSecurityUpgradeInitiator.cs
- HMACSHA512.cs
- BinaryParser.cs
- AmbientProperties.cs
- GenericEnumerator.cs
- CodeAttributeArgument.cs
- TagPrefixAttribute.cs
- IsolatedStorageSecurityState.cs
- ReferencedCollectionType.cs
- EDesignUtil.cs
- QilGenerator.cs
- DataListItemEventArgs.cs
- ResolveMatchesCD1.cs
- DetailsViewPageEventArgs.cs
- FrameworkPropertyMetadata.cs
- ListView.cs
- OdbcUtils.cs
- DataColumnSelectionConverter.cs
- DataMemberAttribute.cs
- ListViewSortEventArgs.cs
- TreeNodeStyleCollection.cs
- IPHostEntry.cs
- DataObject.cs
- InplaceBitmapMetadataWriter.cs
- UndoManager.cs
- DesignerActionMethodItem.cs
- AsymmetricKeyExchangeDeformatter.cs
- RecognizerBase.cs
- DbParameterCollection.cs
- invalidudtexception.cs
- DataGridViewBand.cs
- GenericIdentity.cs
- DataGridViewImageColumn.cs
- FormsAuthenticationModule.cs
- initElementDictionary.cs
- PasswordTextContainer.cs
- MouseGestureValueSerializer.cs
- NavigationWindowAutomationPeer.cs
- QilSortKey.cs
- SystemIcmpV6Statistics.cs
- LabelLiteral.cs
- XsdBuilder.cs
- NotifyCollectionChangedEventArgs.cs
- SemaphoreFullException.cs
- RelatedEnd.cs
- PackageStore.cs
- BitmapEffectDrawingContextState.cs
- Soap12FormatExtensions.cs
- ReadWriteSpinLock.cs
- RootContext.cs
- FactoryGenerator.cs
- AsyncDataRequest.cs
- SmtpDigestAuthenticationModule.cs
- ObjectAnimationBase.cs
- Win32PrintDialog.cs
- BigInt.cs
- TextSerializer.cs
- SelectorAutomationPeer.cs
- ExpressionLexer.cs
- DbSetClause.cs
- DeobfuscatingStream.cs
- ContractSearchPattern.cs
- BufferBuilder.cs
- AstTree.cs
- MemberExpressionHelper.cs
- ProgressChangedEventArgs.cs
- QueryRelOp.cs
- Metafile.cs
- PolyQuadraticBezierSegment.cs
- BigInt.cs
- ColumnCollection.cs
- InstancePersistenceCommand.cs
- RuleSetCollection.cs
- EventLogPermissionHolder.cs
- SerializationSectionGroup.cs
- PrinterResolution.cs
- OwnerDrawPropertyBag.cs
- RowCache.cs
- BasicDesignerLoader.cs
- ConditionalAttribute.cs
- GrammarBuilderPhrase.cs
- HtmlWindowCollection.cs
- FixedPage.cs
- TextDpi.cs
- Image.cs
- FrameSecurityDescriptor.cs
- StylusPlugInCollection.cs
- AsymmetricKeyExchangeFormatter.cs
- RemoteWebConfigurationHostStream.cs
- BindingBase.cs
- RTLAwareMessageBox.cs
- LocalizedNameDescriptionPair.cs
- ToolConsole.cs
- ValueSerializerAttribute.cs
- XsdValidatingReader.cs
- DictionarySectionHandler.cs