Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / ConnectionOrientedTransportChannelListener.cs / 1 / ConnectionOrientedTransportChannelListener.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Runtime.Serialization; using System.ServiceModel.Diagnostics; using System.ServiceModel.Description; using System.ServiceModel; using System.Text; using System.Threading; using System.Security.Principal; abstract class ConnectionOrientedTransportChannelListener : TransportChannelListener , IConnectionOrientedTransportFactorySettings , IConnectionOrientedListenerSettings { int connectionBufferSize; bool exposeConnectionProperty; TimeSpan channelInitializationTimeout; int maxBufferSize; int maxPendingConnections; TimeSpan maxOutputDelay; int maxPendingAccepts; TimeSpan idleTimeout; int maxPooledConnections; TransferMode transferMode; ISecurityCapabilities securityCapabilities; StreamUpgradeProvider upgrade; bool ownUpgrade; EndpointIdentity identity; protected ConnectionOrientedTransportChannelListener(ConnectionOrientedTransportBindingElement bindingElement, BindingContext context) : base(bindingElement, context, bindingElement.HostNameComparisonMode) { if (bindingElement.TransferMode == TransferMode.Buffered) { if (bindingElement.MaxReceivedMessageSize > int.MaxValue) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new ArgumentOutOfRangeException("bindingElement.MaxReceivedMessageSize", SR.GetString(SR.MaxReceivedMessageSizeMustBeInIntegerRange))); } if (bindingElement.MaxBufferSize != bindingElement.MaxReceivedMessageSize) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("bindingElement", SR.GetString(SR.MaxBufferSizeMustMatchMaxReceivedMessageSize)); } } else { if (bindingElement.MaxBufferSize > bindingElement.MaxReceivedMessageSize) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("bindingElement", SR.GetString(SR.MaxBufferSizeMustNotExceedMaxReceivedMessageSize)); } } this.connectionBufferSize = bindingElement.ConnectionBufferSize; this.exposeConnectionProperty = bindingElement.ExposeConnectionProperty; this.InheritBaseAddressSettings = bindingElement.InheritBaseAddressSettings; this.channelInitializationTimeout = bindingElement.ChannelInitializationTimeout; this.maxBufferSize = bindingElement.MaxBufferSize; this.maxPendingConnections = bindingElement.MaxPendingConnections; this.maxOutputDelay = bindingElement.MaxOutputDelay; this.maxPendingAccepts = bindingElement.MaxPendingAccepts; this.transferMode = bindingElement.TransferMode; CollectionupgradeBindingElements = context.BindingParameters.FindAll (); if (upgradeBindingElements.Count > 1) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MultipleStreamUpgradeProvidersInParameters))); } else if ((upgradeBindingElements.Count == 1) && this.SupportsUpgrade(upgradeBindingElements[0])) { this.upgrade = upgradeBindingElements[0].BuildServerStreamUpgradeProvider(context); this.ownUpgrade = true; context.BindingParameters.Remove (); this.securityCapabilities = upgradeBindingElements[0].GetProperty (context); } } public int ConnectionBufferSize { get { return this.connectionBufferSize; } } public TimeSpan IdleTimeout { get { return this.idleTimeout; } } public int MaxPooledConnections { get { return this.maxPooledConnections; } } internal void SetIdleTimeout(TimeSpan idleTimeout) { this.idleTimeout = idleTimeout; } internal void SetMaxPooledConnections(int maxPooledConnections) { this.maxPooledConnections = maxPooledConnections; } internal bool ExposeConnectionProperty { get { return this.exposeConnectionProperty; } } public HostNameComparisonMode HostNameComparisonMode { get { return this.HostNameComparisonModeInternal; } } public override T GetProperty () { if(typeof(T) == typeof(EndpointIdentity)) { return (T)(object)(this.identity); } else if (typeof(T) == typeof(ISecurityCapabilities)) { return (T)(object)this.securityCapabilities; } return base.GetProperty (); } public TimeSpan ChannelInitializationTimeout { get { return this.channelInitializationTimeout; } } public int MaxBufferSize { get { return maxBufferSize; } } public int MaxPendingConnections { get { return this.maxPendingConnections; } } public TimeSpan MaxOutputDelay { get { return maxOutputDelay; } } public int MaxPendingAccepts { get { return this.maxPendingAccepts; } } public StreamUpgradeProvider Upgrade { get { return this.upgrade; } } public TransferMode TransferMode { get { return transferMode; } } internal abstract TraceCode MessageReceivedTraceCode { get; } internal abstract TraceCode MessageReceiveFailedTraceCode { get; } int IConnectionOrientedTransportFactorySettings.MaxBufferSize { get { return MaxBufferSize; } } TransferMode IConnectionOrientedTransportFactorySettings.TransferMode { get { return TransferMode; } } StreamUpgradeProvider IConnectionOrientedTransportFactorySettings.Upgrade { get { return Upgrade; } } ServiceSecurityAuditBehavior IConnectionOrientedTransportFactorySettings.AuditBehavior { get { return base.AuditBehavior; } } internal override int GetMaxBufferSize() { return MaxBufferSize; } protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) { StreamUpgradeProvider localUpgrade = this.Upgrade; if (localUpgrade != null) { return new ChainedOpenAsyncResult(timeout, callback, state, base.OnBeginOpen, base.OnEndOpen, localUpgrade); } else { return base.OnBeginOpen(timeout, callback, state); } } protected override void OnEndOpen(IAsyncResult result) { if (result is ChainedOpenAsyncResult) { ChainedOpenAsyncResult.End(result); } else { base.OnEndOpen(result); } } protected override void OnOpen(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); base.OnOpen(timeout); StreamUpgradeProvider localUpgrade = this.Upgrade; if (localUpgrade != null) { localUpgrade.Open(timeoutHelper.RemainingTime()); } } protected override void OnOpened() { base.OnOpened(); StreamSecurityUpgradeProvider security = this.Upgrade as StreamSecurityUpgradeProvider; if (security != null) { this.identity = security.Identity; } } protected override void OnAbort() { StreamUpgradeProvider localUpgrade = GetUpgrade(); if (localUpgrade != null) { localUpgrade.Abort(); } base.OnAbort(); } protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { StreamUpgradeProvider localUpgrade = GetUpgrade(); if (localUpgrade != null) { return new ChainedCloseAsyncResult(timeout, callback, state, base.OnBeginClose, base.OnEndClose, localUpgrade); } else { return new ChainedCloseAsyncResult(timeout, callback, state, base.OnBeginClose, base.OnEndClose); } } protected override void OnEndClose(IAsyncResult result) { ChainedCloseAsyncResult.End(result); } protected override void OnClose(TimeSpan timeout) { StreamUpgradeProvider localUpgrade = GetUpgrade(); if (localUpgrade != null) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); localUpgrade.Close(timeoutHelper.RemainingTime()); base.OnClose(timeoutHelper.RemainingTime()); } else { base.OnClose(timeout); } } StreamUpgradeProvider GetUpgrade() { StreamUpgradeProvider result = null; lock (ThisLock) { if (this.ownUpgrade) { result = this.upgrade; this.ownUpgrade = false; } } return result; } protected override void ValidateUri(Uri uri) { base.ValidateUri(uri); int maxViaSize = ConnectionOrientedTransportDefaults.MaxViaSize; int encodedSize = Encoding.UTF8.GetByteCount(uri.AbsoluteUri); if (encodedSize > maxViaSize) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new QuotaExceededException(SR.GetString(SR.UriLengthExceedsMaxSupportedSize, uri, encodedSize, maxViaSize))); } } protected virtual bool SupportsUpgrade(StreamUpgradeBindingElement upgradeBindingElement) { return true; } // transfers around the StreamUpgradeProvider from an ownership perspective protected class ConnectionOrientedTransportReplyChannelAcceptor : TransportReplyChannelAcceptor { StreamUpgradeProvider upgrade; public ConnectionOrientedTransportReplyChannelAcceptor(ConnectionOrientedTransportChannelListener listener) : base(listener) { this.upgrade = listener.GetUpgrade(); } protected override ReplyChannel OnCreateChannel() { return new ConnectionOrientedTransportReplyChannel(this.ChannelManager, null); } protected override void OnAbort() { base.OnAbort(); if (this.upgrade != null && !TransferUpgrade()) { this.upgrade.Abort(); } } IAsyncResult DummyBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { return new CompletedAsyncResult(callback, state); } void DummyEndClose(IAsyncResult result) { CompletedAsyncResult.End(result); } protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { ChainedBeginHandler begin1 = DummyBeginClose; ChainedEndHandler end1 = DummyEndClose; if (this.upgrade != null && !TransferUpgrade()) { begin1 = this.upgrade.BeginClose; end1 = this.upgrade.EndClose; } return new ChainedAsyncResult(timeout, callback, state, base.OnBeginClose, base.OnEndClose, begin1, end1); } protected override void OnEndClose(IAsyncResult result) { ChainedAsyncResult.End(result); } protected override void OnClose(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); base.OnClose(timeoutHelper.RemainingTime()); if (this.upgrade != null && !TransferUpgrade()) { this.upgrade.Close(timeoutHelper.RemainingTime()); } } // used to decouple our channel and listener lifetimes bool TransferUpgrade() { ConnectionOrientedTransportReplyChannel singletonChannel = (ConnectionOrientedTransportReplyChannel)base.GetCurrentChannel(); if (singletonChannel == null) { return false; } else { return singletonChannel.TransferUpgrade(this.upgrade); } } // tracks StreamUpgradeProvider so that the channel can outlive the Listener class ConnectionOrientedTransportReplyChannel : TransportReplyChannel { StreamUpgradeProvider upgrade; public ConnectionOrientedTransportReplyChannel(ChannelManagerBase channelManager, EndpointAddress localAddress) : base(channelManager, localAddress) { } public bool TransferUpgrade(StreamUpgradeProvider upgrade) { lock (ThisLock) { if (this.State != CommunicationState.Opened) { return false; } this.upgrade = upgrade; return true; } } protected override void OnAbort() { if (this.upgrade != null) { this.upgrade.Abort(); } base.OnAbort(); } protected override void OnClose(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); if (this.upgrade != null) { this.upgrade.Close(timeoutHelper.RemainingTime()); } base.OnClose(timeoutHelper.RemainingTime()); } IAsyncResult DummyBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { return new CompletedAsyncResult(callback, state); } void DummyEndClose(IAsyncResult result) { CompletedAsyncResult.End(result); } protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { ChainedBeginHandler begin1 = DummyBeginClose; ChainedEndHandler end1 = DummyEndClose; if (this.upgrade != null) { begin1 = this.upgrade.BeginClose; end1 = this.upgrade.EndClose; } return new ChainedAsyncResult(timeout, callback, state, begin1, end1, base.OnBeginClose, base.OnEndClose); } protected override void OnEndClose(IAsyncResult result) { ChainedAsyncResult.End(result); } } } } } // 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
- SamlDelegatingWriter.cs
- TextDecorationCollectionConverter.cs
- MediaTimeline.cs
- DataGridCell.cs
- TextSpan.cs
- PathGradientBrush.cs
- PermissionSet.cs
- MasterPage.cs
- UseLicense.cs
- Int64Converter.cs
- DrawTreeNodeEventArgs.cs
- DebugView.cs
- CellCreator.cs
- DirectoryObjectSecurity.cs
- IxmlLineInfo.cs
- FixedSOMTextRun.cs
- DigestComparer.cs
- _ProxyChain.cs
- WSDualHttpSecurityElement.cs
- ISAPIRuntime.cs
- FormView.cs
- ObjectToken.cs
- HeaderCollection.cs
- CheckBoxPopupAdapter.cs
- PrimarySelectionAdorner.cs
- XmlParser.cs
- XmlObjectSerializerReadContextComplexJson.cs
- ObjectFullSpanRewriter.cs
- OciHandle.cs
- TextFormatterHost.cs
- UrlAuthorizationModule.cs
- SelectedDatesCollection.cs
- AnimatedTypeHelpers.cs
- SessionPageStateSection.cs
- HtmlShimManager.cs
- DocumentReference.cs
- ImageUrlEditor.cs
- WebBrowserDesigner.cs
- DataSourceSelectArguments.cs
- DelegateBodyWriter.cs
- DataService.cs
- DateTime.cs
- OdbcException.cs
- exports.cs
- BasePropertyDescriptor.cs
- InfoCardBaseException.cs
- TemplateXamlParser.cs
- XhtmlConformanceSection.cs
- WebBrowsableAttribute.cs
- HeaderElement.cs
- TemplateManager.cs
- XmlDictionaryReaderQuotas.cs
- StructuredTypeInfo.cs
- DataGridViewHeaderCell.cs
- FontNameEditor.cs
- BaseCAMarshaler.cs
- RequestQueue.cs
- ViewCellSlot.cs
- BinaryObjectReader.cs
- WorkflowViewManager.cs
- StylusDevice.cs
- TextTrailingCharacterEllipsis.cs
- ListenerConnectionDemuxer.cs
- SerialPinChanges.cs
- TerminatorSinks.cs
- Stackframe.cs
- NativeRightsManagementAPIsStructures.cs
- ColorPalette.cs
- PropertyDescriptorComparer.cs
- BitStream.cs
- WindowsButton.cs
- GroupJoinQueryOperator.cs
- InvariantComparer.cs
- MemberPath.cs
- XmlSchemaAttributeGroupRef.cs
- SafeMILHandle.cs
- Help.cs
- ClientRuntimeConfig.cs
- XPathQilFactory.cs
- MsiStyleLogWriter.cs
- DataGridViewAutoSizeColumnsModeEventArgs.cs
- Rule.cs
- DBCommand.cs
- MergeEnumerator.cs
- Helpers.cs
- DocumentDesigner.cs
- DelimitedListTraceListener.cs
- wgx_commands.cs
- OutputCacheSettingsSection.cs
- EntityCommandCompilationException.cs
- XmlNamespaceMapping.cs
- ToolStripGripRenderEventArgs.cs
- SystemException.cs
- ConfigXmlComment.cs
- BuildProviderCollection.cs
- X509AsymmetricSecurityKey.cs
- Int32CollectionConverter.cs
- XmlAnyElementAttributes.cs
- XmlSchemaObject.cs
- AlternationConverter.cs