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
- WindowsListViewItem.cs
- WindowsListViewItemCheckBox.cs
- BitmapCodecInfoInternal.cs
- UnmanagedMarshal.cs
- Style.cs
- Misc.cs
- Registry.cs
- FrameworkElementFactory.cs
- OperationParameterInfo.cs
- JavaScriptString.cs
- JsonUriDataContract.cs
- NoPersistProperty.cs
- RuntimeHelpers.cs
- documentsequencetextpointer.cs
- MessageQueuePermissionEntryCollection.cs
- StringOutput.cs
- WebPartZone.cs
- WebPartManagerInternals.cs
- WebPartZoneCollection.cs
- ImageDesigner.cs
- XmlMtomWriter.cs
- System.Data.OracleClient_BID.cs
- DeferredBinaryDeserializerExtension.cs
- OutputChannel.cs
- ComAdminInterfaces.cs
- LayoutSettings.cs
- PromptStyle.cs
- SchemaReference.cs
- _WinHttpWebProxyDataBuilder.cs
- TypeName.cs
- BookmarkUndoUnit.cs
- TextElementCollectionHelper.cs
- PowerStatus.cs
- GridPattern.cs
- ToolStripOverflow.cs
- HostedElements.cs
- VirtualizingStackPanel.cs
- EventListenerClientSide.cs
- SkipStoryboardToFill.cs
- MetadataCache.cs
- ConfigXmlAttribute.cs
- FontWeightConverter.cs
- CheckableControlBaseAdapter.cs
- ArraySet.cs
- ProcessModuleCollection.cs
- AvTrace.cs
- IDQuery.cs
- ValueTable.cs
- IMembershipProvider.cs
- StylusShape.cs
- AttachInfo.cs
- ApplicationSecurityManager.cs
- MenuDesigner.cs
- TextElement.cs
- DataGridViewToolTip.cs
- XamlStackWriter.cs
- WebPartZone.cs
- IssuanceLicense.cs
- RequestQueue.cs
- WebBaseEventKeyComparer.cs
- DataGridViewDataConnection.cs
- XmlName.cs
- OracleConnection.cs
- LinkDescriptor.cs
- XmlQueryOutput.cs
- ContextQuery.cs
- CompositeCollectionView.cs
- Crc32.cs
- CompilerGlobalScopeAttribute.cs
- VirtualizedItemPattern.cs
- InstanceCreationEditor.cs
- SqlDelegatedTransaction.cs
- EntitySqlQueryCacheEntry.cs
- IxmlLineInfo.cs
- Calendar.cs
- ApplicationActivator.cs
- HtmlFormParameterWriter.cs
- TextTreeExtractElementUndoUnit.cs
- Codec.cs
- SmiEventSink_Default.cs
- OutputCacheSettings.cs
- TempEnvironment.cs
- CancelEventArgs.cs
- TextTreeText.cs
- ChtmlLinkAdapter.cs
- ModuleElement.cs
- ConfigurationLocation.cs
- DetailsViewInsertedEventArgs.cs
- LocationInfo.cs
- DictionaryItemsCollection.cs
- ConstructorExpr.cs
- OleDbFactory.cs
- Italic.cs
- MetadataException.cs
- ItemChangedEventArgs.cs
- DataServiceClientException.cs
- DelegateCompletionCallbackWrapper.cs
- ZeroOpNode.cs
- EntitySet.cs
- SettingsSavedEventArgs.cs