Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx35 / System.WorkflowServices / System / Workflow / Runtime / Hosting / ChannelManagerHelpers.cs / 1305376 / ChannelManagerHelpers.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.Workflow.Runtime.Hosting { using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IdentityModel.Claims; using System.Reflection; using System.Runtime; using System.Security.Principal; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Configuration; using System.ServiceModel.Description; static class ChannelManagerHelpers { static Hashtable contractInfoCollection = Hashtable.Synchronized(new Hashtable()); static object thisLock = new object(); public static EndpointAddress BuildCacheAddress(string endpointName, Type contractType) { Fx.Assert(!string.IsNullOrEmpty(endpointName), "endpointName should not be null"); Fx.Assert(contractType != null, "contractType should not be null"); return BuildCacheAddress(endpointName, contractType.AssemblyQualifiedName); } public static EndpointAddress BuildCacheAddress(string endpointName, string contractName) { Fx.Assert(!string.IsNullOrEmpty(endpointName), "endpointName should not be null"); Fx.Assert(!string.IsNullOrEmpty(contractName), "contractName should not be null"); return new EndpointAddress("channelCache://" + endpointName + "/" + contractName); } public static EndpointAddress BuildCacheAddressWithIdentity(EndpointAddress address) { Fx.Assert(address != null, "address should not be null"); WindowsIdentity identity = WindowsIdentity.GetCurrent(); try { Claim claim = Claim.CreateWindowsSidClaim(identity.User); EndpointIdentity endpointIdentity = EndpointIdentity.CreateIdentity(claim); return new EndpointAddress(address.Uri, endpointIdentity); } finally { identity.Dispose(); } } public static void CloseCommunicationObject(ICommunicationObject communicationObject) { CloseCommunicationObject(communicationObject, ServiceDefaults.CloseTimeout); } public static void CloseCommunicationObject(ICommunicationObject communicationObject, TimeSpan timeout) { if (communicationObject == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("communicationObject"); } bool flag = true; try { if (communicationObject.State == CommunicationState.Opened) { communicationObject.Close(timeout); flag = false; } } catch (CommunicationException communicatioException) { if (DiagnosticUtility.ShouldTraceInformation) { DiagnosticUtility.ExceptionUtility.TraceHandledException(communicatioException, TraceEventType.Information); } } catch (TimeoutException timeoutException) { if (DiagnosticUtility.ShouldTraceInformation) { DiagnosticUtility.ExceptionUtility.TraceHandledException(timeoutException, TraceEventType.Information); } } finally { if (flag) { communicationObject.Abort(); } } } public static IChannel CreateChannel(Type contractType, ChannelFactory factory, string customAddress) { if (contractType == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contractType"); } if (factory == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("factory"); } IChannel channel = null; bool channelFailed = true; try { ContractInfo contractInfo = GetContractInfo(contractType); if (string.IsNullOrEmpty(customAddress)) { channel = contractInfo.CreateChannelMethodInfo.Invoke(factory, null) as IChannel; } else { channel = contractInfo.CreateChannelWithCustomAddressMethodInfo.Invoke(factory, new object[1] { new EndpointAddress(customAddress) }) as IChannel; } if (!contractInfo.IsSessionless) { IContextManager contextManager = channel.GetProperty(); if (contextManager != null) { contextManager.Enabled = false; } } channel.Open(); channelFailed = false; } catch (TargetInvocationException exception) { if (exception.InnerException != null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException); } throw; } finally { if (channel != null && channelFailed) { channel.Abort(); channel = null; } } return channel; } public static ChannelFactory CreateChannelFactory(string endpointName, Type contractType) { return CreateChannelFactory(endpointName, contractType, null); } public static ChannelFactory CreateChannelFactory(string endpointName, Type contractType, IDictionary codeEndpoints) { if (string.IsNullOrEmpty(endpointName)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpointName"); } if (contractType == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contractType"); } ChannelFactory factory = null; bool factoryFailed = true; try { ContractInfo contractInfo = GetContractInfo(contractType); Type channelFactoryType = contractInfo.ChannelFactoryType; object[] args = null; EndpointAddress key = BuildCacheAddress(endpointName, contractType); ServiceEndpoint endpoint = null; if (codeEndpoints != null && codeEndpoints.TryGetValue(key, out endpoint) && !IsEndpointDefinedInConfiguration(endpointName, contractType)) { args = new object[] { endpoint }; } else { args = new object[] { endpointName ?? string.Empty }; } factory = Activator.CreateInstance(channelFactoryType, args) as ChannelFactory; factory.Open(); factoryFailed = false; } catch (TargetInvocationException exception) { if (exception.InnerException != null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException); } throw; } finally { if (factory != null && factoryFailed) { factory.Abort(); } } return factory; } public static bool IsEndpointDefinedInConfiguration(string endpointName, Type contractType) { if (string.IsNullOrEmpty(endpointName)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpointName"); } if (contractType == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contractType"); } bool wildcard = string.Equals(endpointName, "*", StringComparison.Ordinal); ClientSection section = ClientSection.GetSection(); foreach (ChannelEndpointElement element in section.Endpoints) { if ((!wildcard && (element.Name != endpointName)) || (element.Contract != contractType.FullName)) { continue; } return true; } return false; } public static bool IsSessionlessContract(Type contractType) { return GetContractInfo(contractType).IsSessionless; } static ContractInfo GetContractInfo(Type contractType) { ContractInfo contractInfo = contractInfoCollection[contractType] as ContractInfo; if (contractInfo == null) { lock (thisLock) { contractInfo = contractInfoCollection[contractType] as ContractInfo; if (contractInfo == null) { contractInfo = new ContractInfo(contractType); contractInfoCollection.Add(contractType, contractInfo); } } } return contractInfo; } class ContractInfo { Type channelFactoryType; Type contractType; MethodInfo createChannelMethodInfo; MethodInfo createChannelWithCustomAddressMethodInfo; bool isSessionless; public ContractInfo(Type contractType) { this.contractType = contractType; Type[] typeArguments = new Type[] { contractType }; this.channelFactoryType = typeof(ChannelFactory < > ).MakeGenericType(typeArguments); this.createChannelMethodInfo = this.channelFactoryType.GetMethod("CreateChannel", new Type[0] { }); this.createChannelWithCustomAddressMethodInfo = this.channelFactoryType.GetMethod("CreateChannel", new Type[1] { typeof(EndpointAddress) }); this.isSessionless = (ContractDescription.GetContract(contractType).SessionMode == SessionMode.NotAllowed); } public Type ChannelFactoryType { get { return this.channelFactoryType; } } public MethodInfo CreateChannelMethodInfo { get { return this.createChannelMethodInfo; } } public MethodInfo CreateChannelWithCustomAddressMethodInfo { get { return this.createChannelWithCustomAddressMethodInfo; } } public bool IsSessionless { get { return this.isSessionless; } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SafeIUnknown.cs
- Slider.cs
- SQLBoolean.cs
- FontStretch.cs
- QualifiedCellIdBoolean.cs
- TextLineBreak.cs
- Missing.cs
- SignedInfo.cs
- CommandID.cs
- WebPartEditorCancelVerb.cs
- SafeTokenHandle.cs
- SpecialFolderEnumConverter.cs
- AsymmetricAlgorithm.cs
- SQLDateTime.cs
- UiaCoreApi.cs
- CodeTypeReferenceExpression.cs
- SymmetricSecurityProtocol.cs
- ImageDrawing.cs
- WindowsAltTab.cs
- Imaging.cs
- RIPEMD160Managed.cs
- SurrogateSelector.cs
- OdbcReferenceCollection.cs
- SignerInfo.cs
- OleDbConnectionFactory.cs
- CorePropertiesFilter.cs
- SafeFindHandle.cs
- SafeEventLogWriteHandle.cs
- FixedSOMPageConstructor.cs
- ProfileSection.cs
- Configuration.cs
- SkewTransform.cs
- SelectedDatesCollection.cs
- ObjectViewFactory.cs
- WebServiceMethodData.cs
- PasswordRecovery.cs
- Error.cs
- ListChangedEventArgs.cs
- TransformValueSerializer.cs
- UInt64.cs
- ExpandCollapsePatternIdentifiers.cs
- FileLevelControlBuilderAttribute.cs
- EntityDataSourceChangingEventArgs.cs
- ToolBarButton.cs
- ReadOnlyCollectionBase.cs
- ElementInit.cs
- DynamicDiscoSearcher.cs
- PaintValueEventArgs.cs
- EventToken.cs
- Icon.cs
- PassportAuthentication.cs
- ColorConvertedBitmap.cs
- XmlSchemaSimpleContentRestriction.cs
- ChameleonKey.cs
- SqlUdtInfo.cs
- Lease.cs
- URLEditor.cs
- OracleString.cs
- HtmlTableCell.cs
- PageWrapper.cs
- HtmlShim.cs
- XmlSchemaSimpleTypeUnion.cs
- TypeConverterHelper.cs
- ResourceDescriptionAttribute.cs
- AsyncCompletedEventArgs.cs
- XmlChoiceIdentifierAttribute.cs
- Assert.cs
- Transactions.cs
- Variant.cs
- FullTextState.cs
- SiteMembershipCondition.cs
- ExpressionStringBuilder.cs
- WebServiceTypeData.cs
- HttpProfileBase.cs
- InvalidateEvent.cs
- DateTimeConverter.cs
- FamilyMap.cs
- IdentitySection.cs
- PrincipalPermission.cs
- TemplateControl.cs
- IpcChannelHelper.cs
- TextAction.cs
- XPathMultyIterator.cs
- GridViewRow.cs
- GrammarBuilderWildcard.cs
- SerializationInfoEnumerator.cs
- ProcessHostConfigUtils.cs
- Dynamic.cs
- EntityViewGenerator.cs
- QueryResults.cs
- ImpersonationContext.cs
- _emptywebproxy.cs
- XmlAtomicValue.cs
- DataControlFieldCell.cs
- TrackBarRenderer.cs
- DataGridToolTip.cs
- ErrorActivity.cs
- TextBlock.cs
- StatusStrip.cs
- LineServices.cs