【问题标题】:Appfabric WF4-WCF services, how to retrieve current url in codeactivity without httpcontext?Appfabric WF4-WCF服务,如何在没有httpcontext的情况下检索codeactivity中的当前url?
【发布时间】:2010-05-04 12:05:10
【问题描述】:

我开发了一个带有代码活动的 wf-wcf 服务,我想在其中检索服务的当前 URL。 如果我禁用 appfabric 的持久性功能,我可以使用

检索 URL
HttpContext.Current.Request.Url.ToString()

如果启用了持久性功能,则 httpcontext 为空。

是否有其他方法可以检索托管我的代码活动的 WCF 的 URL?

【问题讨论】:

    标签: wcf workflow-foundation-4 appfabric


    【解决方案1】:

    您需要实现 IReceiveMessageCallback 并将其添加到活动的上下文中。在 OnReceiveMessage 中,您可以通过当前 OperationContext 来检查传入的消息。

    This WF4 示例显示了如何执行此操作。

    示例代码:

    using System.Activities;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Activities;
    
    namespace DeclarativeServiceLibrary2
    {
        public sealed class GetWCFMessageTo : NativeActivity
        {
            public Receive Receive { get; set; }
    
            public OutArgument<string> WcfTo { get; set; }
    
            protected override void Execute(NativeActivityContext context)
            {
                context.Properties.Add("ReceiveMessageCallback", new ReceiveMessageCallback());
                context.ScheduleActivity(Receive, CompletionCallback);
            }
    
            private void CompletionCallback(NativeActivityContext context, ActivityInstance completedInstance)
            {
                var receiveMessageCallback = context.Properties.Find("ReceiveMessageCallback") as ReceiveMessageCallback;
                WcfTo.Set(context, receiveMessageCallback.WcfRequestTo);
            }
        }
    
        [DataContract]
        class ReceiveMessageCallback : IReceiveMessageCallback
        {
            public string WcfRequestTo { get; private set; }
    
            public void OnReceiveMessage(OperationContext operationContext, ExecutionProperties activityExecutionProperties)
            {
                WcfRequestTo = operationContext.RequestContext.RequestMessage.Headers.To.ToString();
            }
        }
    }
    

    和示例工作流 XAMLX

    <WorkflowService mc:Ignorable="sap" ConfigurationName="Service1" sap:VirtualizedContainerService.HintSize="307,306" Name="Service1" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel" xmlns:d="clr-namespace:DeclarativeServiceLibrary2;assembly=DeclarativeServiceLibrary2" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:p="http://tempuri.org/" xmlns:p1="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:s4="clr-namespace:System;assembly=System.ServiceModel" xmlns:sa="clr-namespace:System.Activities;assembly=System.Activities" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <p1:Sequence DisplayName="Sequential Service" sad:XamlDebuggerXmlReader.FileName="c:\temp\DeclarativeServiceLibrary2\DeclarativeServiceLibrary2\Service1.xamlx" sap:VirtualizedContainerService.HintSize="277,276" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces">
        <p1:Sequence.Variables>
          <p1:Variable x:TypeArguments="CorrelationHandle" Name="handle" />
          <p1:Variable x:TypeArguments="x:Int32" Name="data" />
          <p1:Variable x:TypeArguments="x:String" Name="WcfRequestTo" />
        </p1:Sequence.Variables>
        <sap:WorkflowViewStateService.ViewState>
          <scg3:Dictionary x:TypeArguments="x:String, x:Object">
            <x:Boolean x:Key="IsExpanded">True</x:Boolean>
          </scg3:Dictionary>
        </sap:WorkflowViewStateService.ViewState>
        <d:GetWCFMessageTo sap:VirtualizedContainerService.HintSize="255,22" WcfTo="[WcfRequestTo]">
          <d:GetWCFMessageTo.Receive>
            <Receive x:Name="__ReferenceID0" CanCreateInstance="True" DisplayName="ReceiveRequest" sap:VirtualizedContainerService.HintSize="255,90" OperationName="GetData" ServiceContractName="p:IService">
              <Receive.CorrelationInitializers>
                <RequestReplyCorrelationInitializer CorrelationHandle="[handle]" />
              </Receive.CorrelationInitializers>
              <ReceiveMessageContent>
                <p1:OutArgument x:TypeArguments="x:Int32">[data]</p1:OutArgument>
              </ReceiveMessageContent>
            </Receive>
          </d:GetWCFMessageTo.Receive>
        </d:GetWCFMessageTo>
        <SendReply Request="{x:Reference __ReferenceID0}" DisplayName="SendResponse" sap:VirtualizedContainerService.HintSize="255,90">
          <SendMessageContent>
            <p1:InArgument x:TypeArguments="x:String">["Received " &amp; data &amp; " WCF To header: " &amp; WcfRequestTo]</p1:InArgument>
          </SendMessageContent>
        </SendReply>
      </p1:Sequence>
    </WorkflowService>
    

    【讨论】:

    • 我对这种方法有两个问题:1)这种方法只适用于 NativeActivity 对吗? 2)在示例中,方法 OnReceiveMessage 没有返回值,我不明白如何将 url 返回到活动。
    • 您将 OutArgument 添加到活动并在您的工作流程中使用它。请参阅更新答案中的示例代码
    • 它有效!多谢。一般来说,这种方法比其他方法更复杂,例如在 MOSS 运行时的 wf 3.5 中。我希望尽快开发出更有用的内置活动或简化整个框架,例如现在引入“环境上下文”,而不是像你这样的人帮助像我这样的新手:)
    • @Maurice 无论如何我可以使用IReceiveMessageCallback 接口和设计器中可用的Receive 活动吗?
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2012-04-20
    • 1970-01-01
    • 2012-10-22
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多