Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.ServiceModel.Activities / System / ServiceModel / Activities / CorrelationHandle.cs / 1305376 / CorrelationHandle.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.ServiceModel.Activities { using System; using System.Activities; using System.Collections.ObjectModel; using System.Runtime; using System.Runtime.DurableInstancing; using System.Runtime.Serialization; [DataContract] public class CorrelationHandle : Handle { internal static readonly string StaticExecutionPropertyName = typeof(CorrelationHandle).FullName; static readonly Type requestReplyCorrelationInitializerType = typeof(RequestReplyCorrelationInitializer); // CorrelationHandles to support Context/Durable Duplex // For processing the CallBackContextMessageProperty static readonly Type callbackCorrelationInitializerType = typeof(CallbackCorrelationInitializer); // This is for passing the Context information that we get in the reply message from the Server in the initial handshake // to the next Sendmessage activity from the client to the server static readonly Type contextCorrelationInitializerType = typeof(ContextCorrelationInitializer); //// To get to the same instance on the server side( between SendReply and following Receive) and on the client side( between Send and following send) //static readonly Type followingContextCorrelationInitializerType = typeof(FollowingContextCorrelationInitializer); CorrelationCallbackContext callbackContext; CorrelationContext context; // This is never null when it matters because the CorrelationHandle sets this during OnInitialize [DataMember] NoPersistHandle noPersistHandle; // This is never null when it matters because the CorrelationHandle sets this during OnInitialize [DataMember] BookmarkScopeHandle bookmarkScopeHandle; public CorrelationHandle() : base() { } internal CorrelationRequestContext RequestContext { get; private set; } internal CorrelationResponseContext ResponseContext { get; private set; } [DataMember(EmitDefaultValue = false)] internal CorrelationCallbackContext CallbackContext { get { return this.callbackContext; } set { Fx.Assert(this.callbackContext == null || this.callbackContext == value, "cannot set two different callback contexts"); this.callbackContext = value; } } [DataMember(EmitDefaultValue = false)] internal CorrelationContext Context { get { return this.context; } set { Fx.Assert(this.context == null || this.context == value, "cannot set two different callback contexts"); this.context = value; } } [DataMember(EmitDefaultValue = false)] internal BookmarkScope Scope { get; set; } protected override void OnInitialize(HandleInitializationContext context) { this.noPersistHandle = context.CreateAndInitializeHandle(); this.bookmarkScopeHandle = context.CreateAndInitializeHandle (); } protected override void OnUninitialize(HandleInitializationContext context) { context.UninitializeHandle(this.noPersistHandle); context.UninitializeHandle(this.bookmarkScopeHandle); } internal BookmarkScope EnsureBookmarkScope(NativeActivityContext executionContext) { if (this.Scope == null) { this.Scope = executionContext.DefaultBookmarkScope; } return this.Scope; } internal bool TryRegisterRequestContext(NativeActivityContext executionContext, CorrelationRequestContext requestContext) { Fx.Assert(requestContext != null, "requires a valid requestContext"); if(this.noPersistHandle == null) { return false; } if (this.RequestContext == null) { this.noPersistHandle.Enter(executionContext); this.RequestContext = requestContext; return true; } return object.ReferenceEquals(this.RequestContext, requestContext); } internal bool TryRegisterResponseContext(NativeActivityContext executionContext, CorrelationResponseContext responseContext) { Fx.Assert(responseContext != null, "requires a valid responseContext"); if (this.noPersistHandle == null) { return false; } if (this.ResponseContext == null) { this.noPersistHandle.Enter(executionContext); this.ResponseContext = responseContext; return true; } return object.ReferenceEquals(this.ResponseContext, responseContext); } internal bool TryAcquireRequestContext(NativeActivityContext executionContext, out CorrelationRequestContext requestContext) { if (this.RequestContext != null) { // We have a context, and we should disassociate it from the correlation handle this.noPersistHandle.Exit(executionContext); requestContext = this.RequestContext; this.RequestContext = null; return true; } else { requestContext = null; return false; } } internal bool TryAcquireResponseContext(NativeActivityContext executionContext, out CorrelationResponseContext responseContext) { if (this.ResponseContext != null) { // We have a context, and we should disassociate it from the correlation handle this.noPersistHandle.Exit(executionContext); responseContext = this.ResponseContext; this.ResponseContext = null; return true; } else { responseContext = null; return false; } } internal void InitializeBookmarkScope(NativeActivityContext context, InstanceKey instanceKey) { Fx.Assert(context != null, "executionContext cannot be null"); Fx.Assert(instanceKey != null, "instanceKey cannot be null"); if (this.Scope == null) { this.bookmarkScopeHandle.CreateBookmarkScope(context, instanceKey.Value); this.Scope = this.bookmarkScopeHandle.BookmarkScope; } else { if(this.Scope.IsInitialized) { if (this.Scope.Id != instanceKey.Value) { throw FxTrace.Exception.AsError( new InvalidOperationException(SR.CorrelationHandleInUse(this.Scope.Id, instanceKey.Value))); } } else { this.Scope.Initialize(context, instanceKey.Value); } } } internal bool IsInitalized() { if (this.Scope != null || this.CallbackContext != null || this.Context != null || this.ResponseContext != null || this.RequestContext != null) { return true; } return false; } internal static CorrelationHandle GetExplicitChannelCorrelation(NativeActivityContext context, Collection correlationInitializers) { return GetTypedCorrelationHandle(context, correlationInitializers, requestReplyCorrelationInitializerType); } internal static CorrelationHandle GetExplicitCallbackCorrelation(NativeActivityContext context, Collection correlationInitializers) { return GetTypedCorrelationHandle(context, correlationInitializers, callbackCorrelationInitializerType); } internal static CorrelationHandle GetExplicitContextCorrelation(NativeActivityContext context, Collection correlationInitializers) { return GetTypedCorrelationHandle(context, correlationInitializers, contextCorrelationInitializerType); } internal static CorrelationHandle GetTypedCorrelationHandle(NativeActivityContext context, Collection correlationInitializers, Type correlationInitializerType) { CorrelationHandle typedCorrelationHandle = null; if (correlationInitializers != null && correlationInitializers.Count > 0) { foreach (CorrelationInitializer correlation in correlationInitializers) { if (correlationInitializerType == correlation.GetType()) { typedCorrelationHandle = correlation.CorrelationHandle.Get(context); // We return the first handle we find break; } } } return typedCorrelationHandle; } } } // 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
- contentDescriptor.cs
- TextMessageEncoder.cs
- ResXBuildProvider.cs
- CodeStatementCollection.cs
- InsufficientMemoryException.cs
- EmptyWorkItem.cs
- DataGridRelationshipRow.cs
- MailAddress.cs
- GuidelineSet.cs
- MetadataSource.cs
- SizeChangedInfo.cs
- PropertyEmitter.cs
- TableItemPatternIdentifiers.cs
- WebConfigurationHost.cs
- SmiXetterAccessMap.cs
- x509store.cs
- ClassGenerator.cs
- WebEventCodes.cs
- CultureInfo.cs
- BindingListCollectionView.cs
- DataSourceSelectArguments.cs
- XXXOnTypeBuilderInstantiation.cs
- DataGridViewComboBoxColumn.cs
- AxisAngleRotation3D.cs
- DataGridViewLayoutData.cs
- ResourcePropertyMemberCodeDomSerializer.cs
- PropertyGeneratedEventArgs.cs
- AsymmetricCryptoHandle.cs
- UniqueIdentifierService.cs
- PrivateFontCollection.cs
- GridSplitter.cs
- ModuleElement.cs
- SqlConnectionString.cs
- SchemaMapping.cs
- AppDomainResourcePerfCounters.cs
- DockingAttribute.cs
- DbReferenceCollection.cs
- BypassElementCollection.cs
- ReflectionTypeLoadException.cs
- ToolStripControlHost.cs
- HasCopySemanticsAttribute.cs
- UseAttributeSetsAction.cs
- IDQuery.cs
- LambdaCompiler.Expressions.cs
- ProfilePropertyMetadata.cs
- TransformationRules.cs
- EventWaitHandle.cs
- SizeKeyFrameCollection.cs
- PropertyTabChangedEvent.cs
- LabelLiteral.cs
- HelpInfo.cs
- MessageQueueKey.cs
- ScrollPatternIdentifiers.cs
- WebException.cs
- AttachInfo.cs
- ListControl.cs
- sqlser.cs
- LicenseException.cs
- ConstNode.cs
- WebPartVerb.cs
- ListViewDeletedEventArgs.cs
- Internal.cs
- LinqDataSourceContextEventArgs.cs
- AdCreatedEventArgs.cs
- DockAndAnchorLayout.cs
- CodeLabeledStatement.cs
- DesignerSelectionListAdapter.cs
- ApplicationHost.cs
- WebPartHelpVerb.cs
- RelatedImageListAttribute.cs
- SQLByteStorage.cs
- FactoryGenerator.cs
- CodeExpressionStatement.cs
- ClientRoleProvider.cs
- BackgroundWorker.cs
- DataGridViewCheckBoxCell.cs
- ComplexPropertyEntry.cs
- HwndAppCommandInputProvider.cs
- OperationDescriptionCollection.cs
- AvTraceFormat.cs
- ProtocolViolationException.cs
- AnimationClock.cs
- XmlAnyElementAttributes.cs
- HttpResponseInternalWrapper.cs
- SynchronizedDispatch.cs
- PersonalizableTypeEntry.cs
- QilInvokeLateBound.cs
- DoubleIndependentAnimationStorage.cs
- Stylesheet.cs
- ContextToken.cs
- CaseDesigner.xaml.cs
- EntityDesignerBuildProvider.cs
- HierarchicalDataBoundControlAdapter.cs
- MetadataSection.cs
- Base64Stream.cs
- DotExpr.cs
- DataSourceXmlClassAttribute.cs
- XhtmlBasicLiteralTextAdapter.cs
- MediaContextNotificationWindow.cs
- FrameDimension.cs