Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.ServiceModel.Discovery / System / ServiceModel / Discovery / ResolveDuplexAsyncResult.cs / 1305376 / ResolveDuplexAsyncResult.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.ServiceModel.Discovery { using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.Runtime; abstract class ResolveDuplexAsyncResult: AsyncResult { readonly IDiscoveryServiceImplementation discoveryServiceImpl; readonly IMulticastSuppressionImplementation multicastSuppressionImpl; readonly ResolveCriteria resolveCriteria; readonly DiscoveryOperationContext context; readonly TimeoutHelper timeoutHelper; static AsyncCompletion onShouldRedirectResolveCompletedCallback = new AsyncCompletion(OnShouldRedirectResolveCompleted); static AsyncCompletion onSendProxyAnnouncementsCompletedCallback = new AsyncCompletion(OnSendProxyAnnouncementsCompleted); static AsyncCompletion onOnResolveCompletedCallback = new AsyncCompletion(OnOnResolveCompleted); static AsyncCompletion onSendResolveResponseCompletedCallback = new AsyncCompletion(OnSendResolveResponseCompleted); TResponseChannel responseChannel; [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] protected ResolveDuplexAsyncResult(TResolveMessage resolveMessage, IDiscoveryServiceImplementation discoveryServiceImpl, IMulticastSuppressionImplementation multicastSuppressionImpl, AsyncCallback callback, object state) : base(callback, state) { Fx.Assert(resolveMessage != null, "The resolveMessage must be non null."); Fx.Assert(discoveryServiceImpl != null, "The discoveryServiceImpl must be non null."); this.discoveryServiceImpl = discoveryServiceImpl; this.multicastSuppressionImpl = multicastSuppressionImpl; if (!this.Validate(resolveMessage)) { this.Complete(true); return; } else { this.context = new DiscoveryOperationContext(OperationContext.Current); this.resolveCriteria = this.GetResolveCriteria(resolveMessage); this.timeoutHelper = new TimeoutHelper(this.resolveCriteria.Duration); this.timeoutHelper.RemainingTime(); this.Process(); } } TResponseChannel ResponseChannel { get { if (this.responseChannel == null) { this.responseChannel = this.context.GetCallbackChannel (); } return this.responseChannel; } } protected virtual bool Validate(TResolveMessage resolveMessage) { return (DiscoveryService.EnsureMessageId() && DiscoveryService.EnsureReplyTo() && this.ValidateContent(resolveMessage) && this.EnsureNotDuplicate()); } protected abstract bool ValidateContent(TResolveMessage resolveMessage); protected abstract ResolveCriteria GetResolveCriteria(TResolveMessage resolveMessage); protected abstract IAsyncResult BeginSendResolveResponse( TResponseChannel responseChannel, DiscoveryMessageSequence discoveryMessageSequence, EndpointDiscoveryMetadata matchingEndpoint, AsyncCallback callback, object state); protected abstract void EndSendResolveResponse(TResponseChannel responseChannel, IAsyncResult result); protected abstract IAsyncResult BeginSendProxyAnnouncement( TResponseChannel responseChannel, DiscoveryMessageSequence discoveryMessageSequence, EndpointDiscoveryMetadata proxyEndpointDiscoveryMetadata, AsyncCallback callback, object state); protected abstract void EndSendProxyAnnouncement(TResponseChannel responseChannel, IAsyncResult result); static bool OnShouldRedirectResolveCompleted(IAsyncResult result) { Collection redirectionEndpoints = null; ResolveDuplexAsyncResult thisPtr = (ResolveDuplexAsyncResult )result.AsyncState; if (thisPtr.multicastSuppressionImpl.EndShouldRedirectResolve(result, out redirectionEndpoints)) { return thisPtr.SendProxyAnnouncements(redirectionEndpoints); } else { return thisPtr.ProcessResolveRequest(); } } static bool OnSendProxyAnnouncementsCompleted(IAsyncResult result) { ProxyAnnouncementsSendAsyncResult.End(result); return true; } static bool OnOnResolveCompleted(IAsyncResult result) { ResolveDuplexAsyncResult thisPtr = (ResolveDuplexAsyncResult )result.AsyncState; EndpointDiscoveryMetadata matchingEndpoint = thisPtr.discoveryServiceImpl.EndResolve(result); return thisPtr.SendResolveResponse(matchingEndpoint); } static bool OnSendResolveResponseCompleted(IAsyncResult result) { ResolveDuplexAsyncResult thisPtr = (ResolveDuplexAsyncResult )result.AsyncState; thisPtr.EndSendResolveResponse(thisPtr.ResponseChannel, result); return true; } void Process() { if ((this.multicastSuppressionImpl != null) && (this.context.DiscoveryMode == ServiceDiscoveryMode.Adhoc)) { if (this.SuppressResolveRequest()) { Complete(true); return; } } else { if (this.ProcessResolveRequest()) { Complete(true); return; } } } bool SuppressResolveRequest() { IAsyncResult result = this.multicastSuppressionImpl.BeginShouldRedirectResolve( this.resolveCriteria, this.PrepareAsyncCompletion(onShouldRedirectResolveCompletedCallback), this); return (result.CompletedSynchronously && OnShouldRedirectResolveCompleted(result)); } bool SendProxyAnnouncements(Collection redirectionEndpoints) { if ((redirectionEndpoints == null) || (redirectionEndpoints.Count == 0)) { return true; } IAsyncResult result = new ProxyAnnouncementsSendAsyncResult( this, redirectionEndpoints, this.PrepareAsyncCompletion(onSendProxyAnnouncementsCompletedCallback), this); return (result.CompletedSynchronously && OnSendProxyAnnouncementsCompleted(result)); } bool ProcessResolveRequest() { IAsyncResult result = this.discoveryServiceImpl.BeginResolve( resolveCriteria, PrepareAsyncCompletion(onOnResolveCompletedCallback), this); return (result.CompletedSynchronously && OnOnResolveCompleted(result)); } bool SendResolveResponse(EndpointDiscoveryMetadata matchingEndpoint) { if (matchingEndpoint == null) { return true; } IContextChannel contextChannel = (IContextChannel)this.ResponseChannel; IAsyncResult result = null; using (new OperationContextScope(contextChannel)) { this.context.AddressDuplexResponseMessage(OperationContext.Current); contextChannel.OperationTimeout = this.timeoutHelper.RemainingTime(); result = this.BeginSendResolveResponse( this.ResponseChannel, this.discoveryServiceImpl.GetNextMessageSequence(), matchingEndpoint, this.PrepareAsyncCompletion(onSendResolveResponseCompletedCallback), this); } return (result.CompletedSynchronously && OnSendResolveResponseCompleted(result)); } bool EnsureNotDuplicate() { bool isDuplicate = this.discoveryServiceImpl.IsDuplicate(OperationContext.Current.IncomingMessageHeaders.MessageId); if (isDuplicate && TD.DuplicateDiscoveryMessageIsEnabled()) { TD.DuplicateDiscoveryMessage( ProtocolStrings.TracingStrings.Resolve, OperationContext.Current.IncomingMessageHeaders.MessageId.ToString()); } return !isDuplicate; } IAsyncResult BeginSendProxyAnnouncement( EndpointDiscoveryMetadata proxyEndpoint, TimeSpan timeout, AsyncCallback callback, object state) { IAsyncResult result; IContextChannel contextChannel = (IContextChannel)this.ResponseChannel; using (new OperationContextScope(contextChannel)) { this.context.AddressDuplexResponseMessage(OperationContext.Current); contextChannel.OperationTimeout = timeout; result = this.BeginSendProxyAnnouncement( this.ResponseChannel, this.discoveryServiceImpl.GetNextMessageSequence(), proxyEndpoint, callback, state); } return result; } void EndSendProxyAnnouncement(IAsyncResult result) { this.EndSendProxyAnnouncement(this.ResponseChannel, result); } class ProxyAnnouncementsSendAsyncResult : RandomDelaySendsAsyncResult { ResolveDuplexAsyncResult resolveDuplexAsyncResult; Collection redirectionEndpoints; public ProxyAnnouncementsSendAsyncResult( ResolveDuplexAsyncResult resolveDuplexAsyncResult, Collection redirectionEndpoints, AsyncCallback callback, object state) : base( redirectionEndpoints.Count, resolveDuplexAsyncResult.context.MaxResponseDelay, callback, state) { this.resolveDuplexAsyncResult = resolveDuplexAsyncResult; this.redirectionEndpoints = redirectionEndpoints; this.Start(this.resolveDuplexAsyncResult.timeoutHelper.RemainingTime()); } public static void End(IAsyncResult result) { AsyncResult.End (result); } protected override IAsyncResult OnBeginSend(int index, TimeSpan timeout, AsyncCallback callback, object state) { return this.resolveDuplexAsyncResult.BeginSendProxyAnnouncement( this.redirectionEndpoints[index], timeout, callback, state); } protected override void OnEndSend(IAsyncResult result) { this.resolveDuplexAsyncResult.EndSendProxyAnnouncement(result); } } } } // 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
- DataSvcMapFileSerializer.cs
- HttpsTransportElement.cs
- PowerStatus.cs
- MimeTypeMapper.cs
- PropertyEmitterBase.cs
- SequentialOutput.cs
- SetStoryboardSpeedRatio.cs
- Accessible.cs
- MenuCommand.cs
- ObjectDataSource.cs
- SQLGuidStorage.cs
- RelationshipFixer.cs
- NavigationCommands.cs
- CorrelationManager.cs
- SystemInfo.cs
- PocoEntityKeyStrategy.cs
- _NegotiateClient.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- DataPagerField.cs
- EncoderNLS.cs
- FormatterServices.cs
- ListBindingConverter.cs
- DllNotFoundException.cs
- DataDocumentXPathNavigator.cs
- CacheOutputQuery.cs
- BindingGroup.cs
- SettingsContext.cs
- PackageDigitalSignature.cs
- ImpersonateTokenRef.cs
- HtmlInputFile.cs
- ToolStripItemEventArgs.cs
- PackagePartCollection.cs
- DataDocumentXPathNavigator.cs
- SqlMultiplexer.cs
- XpsS0ValidatingLoader.cs
- SqlBinder.cs
- HashRepartitionStream.cs
- ComponentChangedEvent.cs
- Config.cs
- HighlightComponent.cs
- LogicalExpressionTypeConverter.cs
- GeneralTransform.cs
- CssTextWriter.cs
- XamlTypeMapperSchemaContext.cs
- ColumnClickEvent.cs
- CallId.cs
- WindowsScrollBarBits.cs
- CodeTryCatchFinallyStatement.cs
- WorkflowInstanceRecord.cs
- InvariantComparer.cs
- DupHandleConnectionReader.cs
- ModifierKeysConverter.cs
- UserControlBuildProvider.cs
- XmlTextEncoder.cs
- WebRequestModuleElementCollection.cs
- InputBindingCollection.cs
- TypedRowGenerator.cs
- SystemUdpStatistics.cs
- PersonalizationProvider.cs
- ObjectDataSourceEventArgs.cs
- SiteMap.cs
- ResXResourceReader.cs
- TextParaLineResult.cs
- Calendar.cs
- PixelShader.cs
- DataGridViewColumn.cs
- DialogResultConverter.cs
- StringExpressionSet.cs
- UnsafeNativeMethods.cs
- PackagePart.cs
- ComPlusDiagnosticTraceSchemas.cs
- DropTarget.cs
- BypassElement.cs
- Vector3DAnimationBase.cs
- Trigger.cs
- DataKey.cs
- DrawingVisual.cs
- X509SecurityTokenProvider.cs
- DesignerValidationSummaryAdapter.cs
- QueueProcessor.cs
- ByeMessageApril2005.cs
- CheckBoxAutomationPeer.cs
- WindowsScrollBar.cs
- _ProxyChain.cs
- HideDisabledControlAdapter.cs
- HyperLink.cs
- ComUdtElementCollection.cs
- SizeValueSerializer.cs
- XmlSchemaComplexContentExtension.cs
- UnregisterInfo.cs
- CompositeScriptReferenceEventArgs.cs
- ContentHostHelper.cs
- RewritingValidator.cs
- BooleanExpr.cs
- MdiWindowListStrip.cs
- TemplateInstanceAttribute.cs
- WindowsFormsDesignerOptionService.cs
- WorkflowMessageEventArgs.cs
- TextEndOfSegment.cs
- WebPartCatalogAddVerb.cs