Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / PeerDuplexChannel.cs / 1 / PeerDuplexChannel.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System; using System.Diagnostics; using System.ServiceModel; using System.ServiceModel.Diagnostics; using System.ServiceModel.Dispatcher; using System.ServiceModel.Security; using System.Threading; class PeerDuplexChannel : DuplexChannel { EndpointAddress to; Uri via; PeerNode peerNode; bool released = false; SecurityProtocol securityProtocol; ChannelManagerBase channelManager; PeerMessageDispatchermessageDispatcher; public PeerDuplexChannel(PeerNodeImplementation peerNode, PeerNodeImplementation.Registration registration, ChannelManagerBase channelManager, EndpointAddress localAddress, Uri via) : base(channelManager, localAddress) { PeerNodeImplementation.ValidateVia(via); if(registration != null) { peerNode = PeerNodeImplementation.Get(via, registration); } this.peerNode = new PeerNode(peerNode); this.to = localAddress; this.via = via; this.channelManager = channelManager; } public override EndpointAddress RemoteAddress { get { return this.to; } } public override Uri Via { get { return this.via; } } public PeerNodeImplementation InnerNode { get { return this.peerNode.InnerNode; } } internal PeerMessageDispatcher Dispatcher { get { return this.messageDispatcher; } set { DiagnosticUtility.DebugAssert(this.State < CommunicationState.Opened, "Can not change the dispatcher on DuplexChannel after Open."); this.messageDispatcher = value; } } // add headers to an outgoing message protected override void AddHeadersTo(Message message) { base.AddHeadersTo(message); if (this.to != null) { this.to.ApplyTo(message); } } public override T GetProperty () { if(typeof(T) == typeof(PeerNode)) { return (T) (object) this.peerNode; } else if(typeof(T) == typeof(PeerNodeImplementation)) { return (T) (object) this.peerNode.InnerNode; } else if(typeof(T) == typeof(IOnlineStatus)) { return (T) (object) this.peerNode; } else if (typeof(T) == typeof(FaultConverter)) { return (T)(object)FaultConverter.GetDefaultFaultConverter(MessageVersion.Soap12WSAddressing10); } return base.GetProperty (); } protected override void OnAbort() { base.OnAbort(); if (this.State < CommunicationState.Closed) { try { this.peerNode.InnerNode.Abort(); } catch(Exception e) { if(DiagnosticUtility.IsFatal(e)) throw; DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Information); } } } protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { return this.peerNode.InnerNode.BeginClose(timeout, callback, state); } protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) { IAsyncResult result = this.peerNode.InnerNode.BeginOpen(timeout, callback, state, true); return result; } protected override void OnClose(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); this.peerNode.InnerNode.Close(timeoutHelper.RemainingTime()); base.OnClose(timeoutHelper.RemainingTime()); } protected override void OnClosing() { base.OnClosing(); ReleaseNode(); } void ReleaseNode() { if (!this.released) { bool release = false; lock(ThisLock) { if (!this.released) { release = this.released = true; } } if (release && (this.peerNode != null)) { if(this.messageDispatcher != null) this.messageDispatcher.Unregister(false); this.peerNode.InnerNode.Release(); } } } protected override void OnEndClose(IAsyncResult result) { PeerNodeImplementation.EndClose(result); } protected override void OnEndOpen(IAsyncResult result) { PeerNodeImplementation.EndOpen(result); } protected override void OnEnqueueItem(Message message) { // set the message's via to the uri on which it was received message.Properties.Via = via; if (DiagnosticUtility.ShouldTraceInformation) { TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.PeerChannelMessageReceived, this, message); } } protected override void OnOpen(TimeSpan timeout) { this.peerNode.OnOpen(); this.peerNode.InnerNode.Open(timeout, true); } protected override void OnFaulted() { base.OnFaulted(); ReleaseNode(); } protected override void OnSend(Message message, TimeSpan timeout) { EndSend(BeginSend(message, timeout, null, null)); } protected override IAsyncResult OnBeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); DiagnosticUtility.DebugAssert(message.Headers.Action != message.Version.Addressing.DefaultFaultAction, "fault action in duplex.send"); if (this.securityProtocol == null) { lock(ThisLock) { if (this.securityProtocol == null) { this.securityProtocol = ((IPeerFactory)channelManager).SecurityManager.CreateSecurityProtocol (this.to, timeoutHelper.RemainingTime()); } } } return this.peerNode.InnerNode.BeginSend(this, message, this.via, (ITransportFactorySettings)Manager, timeoutHelper.RemainingTime(), callback, state, this.securityProtocol); } protected override void OnEndSend(IAsyncResult result) { PeerNodeImplementation.EndSend(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
- ButtonBaseAutomationPeer.cs
- RemoteWebConfigurationHost.cs
- InfoCardUIAgent.cs
- NetStream.cs
- SystemColorTracker.cs
- SqlClientFactory.cs
- CompositeDataBoundControl.cs
- AmbiguousMatchException.cs
- FaultHandlingFilter.cs
- ScriptComponentDescriptor.cs
- BamlCollectionHolder.cs
- ConstraintStruct.cs
- XmlConvert.cs
- AuthenticationSection.cs
- MetadataArtifactLoaderCompositeResource.cs
- FileDialogCustomPlace.cs
- AxHost.cs
- CompiledXpathExpr.cs
- LinearGradientBrush.cs
- TraceListener.cs
- OciHandle.cs
- HttpContext.cs
- LineProperties.cs
- DeploymentSectionCache.cs
- DateTimeSerializationSection.cs
- RenderDataDrawingContext.cs
- ProtocolsConfiguration.cs
- Visual3D.cs
- MsmqVerifier.cs
- XmlExpressionDumper.cs
- BehaviorService.cs
- HoistedLocals.cs
- DateTimeOffsetConverter.cs
- DetailsViewUpdatedEventArgs.cs
- RootContext.cs
- ProtectedProviderSettings.cs
- _NegotiateClient.cs
- AdCreatedEventArgs.cs
- SqlUserDefinedAggregateAttribute.cs
- GridViewColumnCollection.cs
- AdPostCacheSubstitution.cs
- OutOfProcStateClientManager.cs
- HierarchicalDataBoundControlAdapter.cs
- ProcessProtocolHandler.cs
- WsdlServiceChannelBuilder.cs
- WindowsListViewItemStartMenu.cs
- XmlNamespaceMappingCollection.cs
- InheritanceUI.cs
- MsmqIntegrationAppDomainProtocolHandler.cs
- URIFormatException.cs
- SHA1Managed.cs
- MemberAccessException.cs
- CryptoStream.cs
- ApplicationInterop.cs
- DomainLiteralReader.cs
- ScrollContentPresenter.cs
- OracleConnection.cs
- SiteMapNodeCollection.cs
- PngBitmapDecoder.cs
- XmlNullResolver.cs
- InstanceCompleteException.cs
- RegexStringValidator.cs
- SpecialTypeDataContract.cs
- AuthenticationModulesSection.cs
- FastEncoderWindow.cs
- __Filters.cs
- DataGridView.cs
- CodePageUtils.cs
- GridViewColumnHeader.cs
- PreviewPrintController.cs
- ContravarianceAdapter.cs
- LinqDataSourceSelectEventArgs.cs
- Function.cs
- TimeBoundedCache.cs
- SqlParameterCollection.cs
- UpdateManifestForBrowserApplication.cs
- CodeNamespaceImport.cs
- HotSpotCollection.cs
- PropertyTab.cs
- ClonableStack.cs
- RegexCompiler.cs
- SystemDiagnosticsSection.cs
- XmlRootAttribute.cs
- ExtendedProtectionPolicyElement.cs
- PeerCredential.cs
- PointCollection.cs
- Group.cs
- MonikerSyntaxException.cs
- NetDataContractSerializer.cs
- DbParameterCollectionHelper.cs
- TypeElement.cs
- TypeInfo.cs
- TextUtf8RawTextWriter.cs
- ToolStripStatusLabel.cs
- StaticSiteMapProvider.cs
- ExceptionValidationRule.cs
- TraceSection.cs
- FamilyTypeface.cs
- FixedTextSelectionProcessor.cs
- Touch.cs