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
- MessageQueueInstaller.cs
- AnimationStorage.cs
- GridSplitterAutomationPeer.cs
- HttpProfileGroupBase.cs
- FixedHyperLink.cs
- RadioButton.cs
- LoadMessageLogger.cs
- Int16AnimationUsingKeyFrames.cs
- ScriptControl.cs
- Converter.cs
- SqlDelegatedTransaction.cs
- MatrixTransform.cs
- FusionWrap.cs
- DataListAutoFormat.cs
- KoreanLunisolarCalendar.cs
- InternalSafeNativeMethods.cs
- HuffCodec.cs
- FreezableOperations.cs
- DummyDataSource.cs
- SafeEventLogReadHandle.cs
- ActivityDesigner.cs
- TaskbarItemInfo.cs
- CommandDevice.cs
- ITreeGenerator.cs
- BamlLocalizer.cs
- ColumnMapVisitor.cs
- MsmqMessage.cs
- AdornerDecorator.cs
- PersistChildrenAttribute.cs
- CommittableTransaction.cs
- LifetimeManager.cs
- SecurityContext.cs
- TableLayoutSettingsTypeConverter.cs
- PackWebRequestFactory.cs
- ClientSettingsProvider.cs
- SessionStateUtil.cs
- FragmentQuery.cs
- FixUp.cs
- ObjectParameter.cs
- TypeGeneratedEventArgs.cs
- DataGridViewTextBoxEditingControl.cs
- RegexReplacement.cs
- RowToFieldTransformer.cs
- AQNBuilder.cs
- BitmapEffectCollection.cs
- SiteMapSection.cs
- ManagementClass.cs
- CurrencyManager.cs
- FixedTextView.cs
- RightsManagementSuppressedStream.cs
- Evidence.cs
- Link.cs
- Sentence.cs
- ArrayTypeMismatchException.cs
- PermissionToken.cs
- RangeBaseAutomationPeer.cs
- HyperLinkStyle.cs
- RangeContentEnumerator.cs
- FlowLayoutPanelDesigner.cs
- UInt64Converter.cs
- AccessibleObject.cs
- ListBoxItem.cs
- ExpressionTextBox.xaml.cs
- WebMessageEncodingElement.cs
- ControlIdConverter.cs
- WebPartConnectionsCancelEventArgs.cs
- SqlConnectionHelper.cs
- CorrelationExtension.cs
- ShapingWorkspace.cs
- ScrollableControlDesigner.cs
- InputLanguage.cs
- AttributeEmitter.cs
- FillBehavior.cs
- ProviderConnectionPointCollection.cs
- EllipticalNodeOperations.cs
- SafeNativeMethods.cs
- ClaimTypes.cs
- _HeaderInfoTable.cs
- EntityDataSourceChangedEventArgs.cs
- PropertyConverter.cs
- ResXFileRef.cs
- CodeExpressionRuleDeclaration.cs
- RedBlackList.cs
- TableTextElementCollectionInternal.cs
- StringUtil.cs
- TimelineCollection.cs
- DataGridViewSelectedRowCollection.cs
- NavigationEventArgs.cs
- ReachSerializer.cs
- NoneExcludedImageIndexConverter.cs
- XmlParser.cs
- InkCanvasSelection.cs
- IIS7UserPrincipal.cs
- WindowsToolbarAsMenu.cs
- Attachment.cs
- GuidelineCollection.cs
- XmlHelper.cs
- DataRow.cs
- ScriptBehaviorDescriptor.cs
- SkewTransform.cs