Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / SMSvcHost / System / ServiceModel / Activation / ListenerConnectionDemuxer.cs / 1 / ListenerConnectionDemuxer.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Activation { using System; using System.Collections.Generic; using System.IO; using System.Diagnostics; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Activation.Diagnostics; using System.ServiceModel.Dispatcher; class ListenerConnectionDemuxer { ConnectionAcceptor acceptor; ListconnectionReaders; bool isDisposed; ListenerConnectionModeCallback onConnectionModeKnown; ConnectionClosedCallback onConnectionClosed; // this is the one provided by the caller ConnectionHandleDuplicated connectionHandleDuplicated; // this is the onw we use internally ViaDecodedCallback onViaDecoded; TransportType transportType; TimeSpan channelInitializationTimeout; public ListenerConnectionDemuxer(IConnectionListener listener, TransportType transportType, int maxAccepts, int initialMaxPendingConnections, TimeSpan channelInitializationTimeout, ConnectionHandleDuplicated connectionHandleDuplicated) { this.transportType = transportType; this.connectionReaders = new List (); this.connectionHandleDuplicated = connectionHandleDuplicated; this.acceptor = new ConnectionAcceptor(listener, maxAccepts, initialMaxPendingConnections, OnConnectionAvailable); this.channelInitializationTimeout = channelInitializationTimeout; this.onConnectionClosed = new ConnectionClosedCallback(OnConnectionClosed); this.onViaDecoded = new ViaDecodedCallback(OnViaDecoded); } object ThisLock { get { return this; } } public void Dispose() { lock (ThisLock) { if (isDisposed) return; isDisposed = true; } for (int i = 0; i < connectionReaders.Count; i++) { connectionReaders[i].Dispose(); } connectionReaders.Clear(); acceptor.Dispose(); } ListenerConnectionModeReader SetupModeReader(IConnection connection) { if (onConnectionModeKnown == null) { onConnectionModeKnown = new ListenerConnectionModeCallback(OnConnectionModeKnown); } ListenerConnectionModeReader modeReader = new ListenerConnectionModeReader(connection, onConnectionModeKnown, onConnectionClosed); lock (ThisLock) { if (isDisposed) { modeReader.Dispose(); return null; } else { connectionReaders.Add(modeReader); return modeReader; } } } void OnConnectionAvailable(IConnection connection, ItemDequeuedCallback connectionDequeuedCallback) { if (transportType == TransportType.Tcp) { ListenerPerfCounters.IncrementConnectionsAcceptedTcp(); } else { ListenerPerfCounters.IncrementConnectionsAcceptedNamedPipe(); } ListenerConnectionModeReader modeReader = SetupModeReader(connection); if (modeReader != null) { // StartReading() will never throw non-fatal exceptions; // it propagates all exceptions into the onConnectionModeKnown callback, // which is where we need our robust handling modeReader.StartReading(this.channelInitializationTimeout, connectionDequeuedCallback); } else { connectionDequeuedCallback(); } } void OnConnectionModeKnown(ListenerConnectionModeReader modeReader) { lock (ThisLock) { if (isDisposed) { return; } connectionReaders.Remove(modeReader); } try { FramingMode framingMode = modeReader.GetConnectionMode(); switch (framingMode) { case FramingMode.Duplex: OnDuplexConnection(modeReader); break; case FramingMode.Singleton: OnSingletonConnection(modeReader); break; default: { Exception inner = new InvalidDataException(SR.GetString( SR.FramingModeNotSupported, framingMode)); Exception exception = new ProtocolException(inner.Message, inner); FramingEncodingString.AddFaultString(exception, FramingEncodingString.UnsupportedModeFault); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception); } } } catch (ProtocolException exception) { if (DiagnosticUtility.ShouldTraceInformation) { DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); } modeReader.Dispose(); } catch (Exception exception) { if (DiagnosticUtility.IsFatal(exception)) { throw; } if (DiagnosticUtility.ShouldTraceError) { DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Error); } // containment -- abort the errant reader modeReader.Dispose(); } } void OnViaDecoded(InitialServerConnectionReader connectionReader, ListenerSessionConnection session) { try { connectionHandleDuplicated(session); } finally { session.TriggerDequeuedCallback(); } lock (ThisLock) { if (isDisposed) { return; } connectionReaders.Remove(connectionReader); } } void OnConnectionClosed(InitialServerConnectionReader connectionReader) { lock (ThisLock) { if (isDisposed) { return; } connectionReaders.Remove(connectionReader); } } void OnSingletonConnection(ListenerConnectionModeReader modeReader) { ListenerSingletonConnectionReader singletonReader = new ListenerSingletonConnectionReader( modeReader.Connection, modeReader.GetConnectionDequeuedCallback(), transportType, modeReader.StreamPosition, modeReader.BufferOffset, modeReader.BufferSize, onConnectionClosed, onViaDecoded); lock (ThisLock) { if (isDisposed) { singletonReader.Dispose(); return; } connectionReaders.Add(singletonReader); } singletonReader.StartReading(modeReader.AccruedData, modeReader.GetRemainingTimeout()); } void OnDuplexConnection(ListenerConnectionModeReader modeReader) { ListenerSessionConnectionReader sessionReader = new ListenerSessionConnectionReader( modeReader.Connection, modeReader.GetConnectionDequeuedCallback(), transportType, modeReader.StreamPosition, modeReader.BufferOffset, modeReader.BufferSize, onConnectionClosed, onViaDecoded); lock (ThisLock) { if (isDisposed) { sessionReader.Dispose(); return; } connectionReaders.Add(sessionReader); } sessionReader.StartReading(modeReader.AccruedData, modeReader.GetRemainingTimeout()); } public void StartDemuxing() { acceptor.StartAccepting(); } } } // 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
- SimpleRecyclingCache.cs
- tooltip.cs
- GenericIdentity.cs
- StackSpiller.Generated.cs
- FontStretchConverter.cs
- ServiceAuthorizationManager.cs
- TdsParserSafeHandles.cs
- RuntimeIdentifierPropertyAttribute.cs
- BitmapEffectGroup.cs
- HuffModule.cs
- ListParagraph.cs
- QueueAccessMode.cs
- KerberosRequestorSecurityToken.cs
- IgnoreSectionHandler.cs
- PointCollectionValueSerializer.cs
- ValidateNames.cs
- DropShadowBitmapEffect.cs
- EventProxy.cs
- RecognizerStateChangedEventArgs.cs
- WasAdminWrapper.cs
- UnsafeNetInfoNativeMethods.cs
- TypeHelpers.cs
- Char.cs
- XmlSchemaObjectTable.cs
- Operand.cs
- BehaviorEditorPart.cs
- SyncOperationState.cs
- AbsoluteQuery.cs
- StateBag.cs
- DetailsViewUpdateEventArgs.cs
- Material.cs
- HijriCalendar.cs
- Nodes.cs
- TextSyndicationContentKindHelper.cs
- RestHandlerFactory.cs
- DataGridRowEventArgs.cs
- XPathNodeIterator.cs
- Button.cs
- ObjectDisposedException.cs
- StringFreezingAttribute.cs
- SslStream.cs
- ScriptReferenceBase.cs
- ObjectNavigationPropertyMapping.cs
- DropShadowEffect.cs
- SafeTimerHandle.cs
- Profiler.cs
- FileVersionInfo.cs
- DictionaryEntry.cs
- GuidTagList.cs
- Constants.cs
- COM2IDispatchConverter.cs
- ErrorTableItemStyle.cs
- WorkflowDesignerColors.cs
- TemplateParser.cs
- CorePropertiesFilter.cs
- ProcessThreadCollection.cs
- DetailsViewDeleteEventArgs.cs
- DoWorkEventArgs.cs
- sqlinternaltransaction.cs
- RetrieveVirtualItemEventArgs.cs
- CookielessHelper.cs
- Compilation.cs
- WebContext.cs
- XmlAttributeOverrides.cs
- DurationConverter.cs
- NullExtension.cs
- NoResizeSelectionBorderGlyph.cs
- InstanceView.cs
- Symbol.cs
- DesignerSelectionListAdapter.cs
- WebPartExportVerb.cs
- ClientCredentials.cs
- DataGridViewRowContextMenuStripNeededEventArgs.cs
- ObfuscateAssemblyAttribute.cs
- CodeTypeReferenceExpression.cs
- ToolStripCustomTypeDescriptor.cs
- ViewRendering.cs
- RSAOAEPKeyExchangeFormatter.cs
- XmlBindingWorker.cs
- NotSupportedException.cs
- DataBindingExpressionBuilder.cs
- BaseResourcesBuildProvider.cs
- JsonServiceDocumentSerializer.cs
- ComplusEndpointConfigContainer.cs
- IncrementalHitTester.cs
- ToolStripDropDownClosingEventArgs.cs
- FontSourceCollection.cs
- GeometryHitTestResult.cs
- ValuePattern.cs
- DataColumnMapping.cs
- XmlHierarchicalDataSourceView.cs
- TableLayoutRowStyleCollection.cs
- ValueType.cs
- WorkflowDataContext.cs
- SignedPkcs7.cs
- TransformerInfo.cs
- BamlLocalizationDictionary.cs
- ScrollChangedEventArgs.cs
- SerializerDescriptor.cs
- COM2TypeInfoProcessor.cs