Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.ServiceModel.Activities / System / ServiceModel / Activities / MessagingActivityHelper.cs / 1651602 / MessagingActivityHelper.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.ServiceModel.Activities { using System; using System.Activities; using System.Activities.Expressions; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Runtime; using System.Runtime.DurableInstancing; using System.ServiceModel; using System.ServiceModel.Activities.Dispatcher; using System.ServiceModel.Channels; using System.Xaml; using Microsoft.VisualBasic.Activities; using SR2 = System.ServiceModel.Activities.SR; static class MessagingActivityHelper { static Type faultExceptionType = typeof(FaultException); static Type faultExceptionGenericType = typeof(FaultException<>); public const string ActivityInstanceId = "ActivityInstanceId"; public const string ActivityName = "ActivityName"; public const string ActivityType = "ActivityType"; public const string ActivityTypeExecuteUserCode = "ExecuteUserCode"; public const string MessagingActivityTypeActivityExecution = "MessagingActivityExecution"; public const string E2EActivityId = "E2EActivityId"; public const string MessageId = "MessageId"; public const string ActivityNameWorkflowOperationInvoke = "WorkflowOperationInvoke"; public const string MessageCorrelationReceiveRecord = "MessageCorrelationReceiveRecord"; public const string MessageCorrelationSendRecord = "MessageCorrelationSendRecord"; public static void FixMessageArgument(Argument messageArgument, ArgumentDirection direction, ActivityMetadata metadata) { Type messageType = (messageArgument == null) ? TypeHelper.ObjectType : messageArgument.ArgumentType; AddRuntimeArgument(messageArgument, "Message", messageType, direction, metadata); } public static void AddRuntimeArgument(Argument messageArgument, string runtimeArgumentName, Type runtimeArgumentType, ArgumentDirection runtimeArgumentDirection, ActivityMetadata metadata) { RuntimeArgument argument = new RuntimeArgument(runtimeArgumentName, runtimeArgumentType, runtimeArgumentDirection); metadata.Bind(messageArgument, argument); metadata.AddArgument(argument); } // public static IListGetCallbacks (ExecutionProperties executionProperties) where T : class { List list = null; if (!executionProperties.IsEmpty) { T temp; foreach (KeyValuePair item in executionProperties) { temp = item.Value as T; if (temp != null) { if (list == null) { list = new List (); } list.Add(temp); } } } return list; } public static Message InitializeCorrelationHandles(NativeActivityContext context, CorrelationHandle selectHandle, CorrelationHandle ambientHandle, Collection additionalCorrelations, CorrelationKeyCalculator keyCalculator, Message message) { InstanceKey instanceKey; ICollection additionalKeys; // MessageBuffer buffer = message.CreateBufferedCopy(int.MaxValue); if (keyCalculator.CalculateKeys(buffer, message, out instanceKey, out additionalKeys)) { InitializeCorrelationHandles(context, selectHandle, ambientHandle, additionalCorrelations, instanceKey, additionalKeys); } return buffer.CreateMessage(); } public static void InitializeCorrelationHandles(NativeActivityContext context, CorrelationHandle selectHandle, CorrelationHandle ambientHandle, Collection additionalCorrelations, MessageProperties messageProperties) { CorrelationMessageProperty correlationMessageProperty; if (CorrelationMessageProperty.TryGet(messageProperties, out correlationMessageProperty)) { InitializeCorrelationHandles(context, selectHandle, ambientHandle, additionalCorrelations, correlationMessageProperty.CorrelationKey, correlationMessageProperty.AdditionalKeys); } } // both receive and send initialize correlations using this method // if selectHandle is not null, we first try to initalize instanceKey with it , else we try to initalize the ambient handle // if ambient handle is not used for initializing instance key , we might use it for initalizing queryCorrelationsInitalizer. // SelectHandle usage: // Receive: selectHandle is the correlatesWith handle // SendReply: in case of context based correlation, this is the context handle // Send: in case of context based correlation, this will be the callback handle // ReceiveReply: selectHandle will be always null // Note that only Receive can initialize a content based correlation with a selectHandle (parallel convoy) static void InitializeCorrelationHandles(NativeActivityContext context, CorrelationHandle selectHandle, CorrelationHandle ambientHandle, Collection additionalCorrelations, InstanceKey instanceKey, ICollection additionalKeys) { bool isAmbientHandleUsed = false; if (instanceKey != null && instanceKey.IsValid) { if (selectHandle != null) { selectHandle.InitializeBookmarkScope(context, instanceKey); } else if (ambientHandle != null) { ambientHandle.InitializeBookmarkScope(context, instanceKey); isAmbientHandleUsed = true; } else if (context.DefaultBookmarkScope.IsInitialized) { if (context.DefaultBookmarkScope.Id != instanceKey.Value) { throw FxTrace.Exception.AsError( new InvalidOperationException(SR2.CorrelationHandleInUse(context.DefaultBookmarkScope.Id, instanceKey.Value))); } } else { context.DefaultBookmarkScope.Initialize(context, instanceKey.Value); } } if (additionalKeys != null && additionalCorrelations != null) { // The ordering of items in SelectAdditional and additional correlations are the same // Therefore, we assign keys iteratively IEnumerator enumerator = additionalCorrelations.GetEnumerator(); foreach (InstanceKey key in additionalKeys) { Fx.Assert(key != null && key.IsValid, "only valid keys should be passed into InitializeCorrelationHandles"); while (enumerator.MoveNext()) { QueryCorrelationInitializer queryCorrelation = enumerator.Current as QueryCorrelationInitializer; if (queryCorrelation != null) { CorrelationHandle handle = (queryCorrelation.CorrelationHandle != null ? queryCorrelation.CorrelationHandle.Get(context) : null); if (handle == null) { if (ambientHandle != null && !isAmbientHandleUsed) { handle = ambientHandle; isAmbientHandleUsed = true; } else { throw FxTrace.Exception.AsError( new InvalidOperationException(SR2.QueryCorrelationInitializerCannotBeInitialized)); } } handle.InitializeBookmarkScope(context, key); break; } } } } } public static CorrelationCallbackContext CreateCorrelationCallbackContext(MessageProperties messageProperties) { CallbackContextMessageProperty callbackMessageContextProperty; if (CallbackContextMessageProperty.TryGet(messageProperties, out callbackMessageContextProperty)) { EndpointAddress listenAddress; IDictionary context; callbackMessageContextProperty.GetListenAddressAndContext(out listenAddress, out context); return new CorrelationCallbackContext { ListenAddress = EndpointAddress10.FromEndpointAddress(listenAddress), Context = context }; } return null; } public static CorrelationContext CreateCorrelationContext(MessageProperties messageProperties) { ContextMessageProperty contextMessageProperty; if (ContextMessageProperty.TryGet(messageProperties, out contextMessageProperty)) { IDictionary context; context = contextMessageProperty.Context; return new CorrelationContext { Context = context }; } return null; } public static bool CompareContextEquality(IDictionary context1, IDictionary context2) { if (context1 != context2) { if (context1 == null || context2 == null || context1.Count != context2.Count) { return false; } foreach (KeyValuePair pair in context1) { if (!context2.Contains(pair)) { return false; } } } return true; } public static InArgument CreateReplyCorrelatesWith(InArgument requestCorrelatesWith) { Fx.Assert(requestCorrelatesWith != null, "Argument cannot be null!"); VariableValue variableValue = requestCorrelatesWith.Expression as VariableValue ; if (variableValue != null) { return new InArgument (variableValue.Variable); } VisualBasicValue vbvalue = requestCorrelatesWith.Expression as VisualBasicValue ; if(vbvalue != null) { return new InArgument (new VisualBasicValue (vbvalue.ExpressionText)); } // We use XAML roundtrip to clone expression string xamlStr = XamlServices.Save(requestCorrelatesWith.Expression); object obj = XamlServices.Parse(xamlStr); Activity expression = obj as Activity ; Fx.Assert(expression != null, "Failed to clone CorrelationHandle using XAML roundtrip!"); return new InArgument (expression); } public static void ValidateCorrelationInitializer(ActivityMetadata metadata, Collection correlationInitializers, bool isReply, string displayName, string operationName) { Fx.Assert(metadata != null, "cannot be null"); if (correlationInitializers != null && correlationInitializers.Count > 0) { bool queryInitializerWithEmptyHandle = false; foreach (CorrelationInitializer correlation in correlationInitializers) { if (correlation is RequestReplyCorrelationInitializer && isReply) { // This is a reply, so additional correlations should not have a request reply handle metadata.AddValidationError(SR.ReplyShouldNotIncludeRequestReplyHandle(displayName, operationName)); } QueryCorrelationInitializer queryCorrelation = correlation as QueryCorrelationInitializer; if (queryCorrelation != null) { if (queryCorrelation.MessageQuerySet.Count == 0) { metadata.AddValidationError(SR.QueryCorrelationInitializerWithEmptyMessageQuerySet(displayName, operationName)); } } if (correlation.CorrelationHandle == null) { if (correlation is QueryCorrelationInitializer) { if (!queryInitializerWithEmptyHandle) { queryInitializerWithEmptyHandle = true; } else { // more than one queryInitializer present, in this case we don't permit null handle metadata.AddValidationError(SR.NullCorrelationHandleInMultipleQueryCorrelation); } } else { metadata.AddValidationError(SR.NullCorrelationHandleInInitializeCorrelation(correlation.GetType().Name)); } } } } } } } // 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
- ButtonBaseAdapter.cs
- ReflectionServiceProvider.cs
- ListViewSortEventArgs.cs
- WS2007HttpBindingCollectionElement.cs
- ActiveXHelper.cs
- StdRegProviderWrapper.cs
- X509CertificateCollection.cs
- codemethodreferenceexpression.cs
- BitmapMetadataEnumerator.cs
- SecuritySessionSecurityTokenProvider.cs
- DBCommandBuilder.cs
- RoutingUtilities.cs
- BrowserCapabilitiesCodeGenerator.cs
- RectAnimation.cs
- RichTextBox.cs
- Rect3D.cs
- BlobPersonalizationState.cs
- smtpconnection.cs
- SqlMetaData.cs
- Soap.cs
- ClientRequest.cs
- WindowsListViewScroll.cs
- HMACSHA384.cs
- XmlILOptimizerVisitor.cs
- StylusCaptureWithinProperty.cs
- XmlAnyElementAttributes.cs
- XpsS0ValidatingLoader.cs
- GlyphManager.cs
- MouseButton.cs
- CfgRule.cs
- ToolStripScrollButton.cs
- arclist.cs
- ListBox.cs
- ResXBuildProvider.cs
- BufferedResponseStream.cs
- EtwTrackingBehaviorElement.cs
- Span.cs
- FixedSOMPage.cs
- AddToCollection.cs
- ConfigurationValue.cs
- ObjectParameter.cs
- smtpconnection.cs
- SafeCryptContextHandle.cs
- HttpGetProtocolReflector.cs
- DesignerObject.cs
- EmissiveMaterial.cs
- TypeLibraryHelper.cs
- ProtectedConfigurationProviderCollection.cs
- Type.cs
- TableCell.cs
- SimpleHandlerFactory.cs
- MonikerProxyAttribute.cs
- EnumValAlphaComparer.cs
- EntitySqlQueryCacheKey.cs
- ExcCanonicalXml.cs
- SqlMetaData.cs
- basenumberconverter.cs
- SqlXml.cs
- TimeIntervalCollection.cs
- StateManagedCollection.cs
- QilValidationVisitor.cs
- LocatorPartList.cs
- PasswordBox.cs
- mactripleDES.cs
- TrackingProfileCache.cs
- TextStore.cs
- PrivilegeNotHeldException.cs
- StoreAnnotationsMap.cs
- ListDictionaryInternal.cs
- OrderByLifter.cs
- FixUpCollection.cs
- BitmapEffectInputConnector.cs
- DataSet.cs
- IndexedDataBuffer.cs
- COM2EnumConverter.cs
- DiscoveryEndpoint.cs
- Triangle.cs
- SimplePropertyEntry.cs
- WebPartTransformerAttribute.cs
- DataGridViewRowCollection.cs
- XmlFormatExtensionPrefixAttribute.cs
- Size3D.cs
- GorillaCodec.cs
- MergeFilterQuery.cs
- ImageBrush.cs
- SqlClientPermission.cs
- DbParameterCollectionHelper.cs
- CodeSnippetStatement.cs
- SiteOfOriginContainer.cs
- embossbitmapeffect.cs
- TextAction.cs
- SoapServerMessage.cs
- AttributeData.cs
- ProviderUtil.cs
- ActivityTypeDesigner.xaml.cs
- VirtualPathData.cs
- PersonalizationProvider.cs
- XmlReader.cs
- EncoderBestFitFallback.cs
- ManagementBaseObject.cs