Appfabric WF4-WCF服务,如何在没有httpcontext的情况下检索codeactivity中的当前url?

Appfabric WF4-WCF服务,如何在没有httpcontext的情况下检索codeactivity中的当前url?,wcf,workflow-foundation-4,appfabric,Wcf,Workflow Foundation 4,Appfabric,我已经开发了一个带有代码活动的wf wcf服务,我想在其中检索服务的当前URL。 如果我禁用appfabric的持久性功能,我可以使用 HttpContext.Current.Request.Url.ToString() 如果启用了持久性功能,则httpcontext为空 是否有其他方法检索承载“我的代码”活动的WCF的URL?您需要实现并将其添加到活动的上下文中。在OnReceiveMessage中,将传递当前操作上下文,允许您检查传入消息 WF4示例演示了如何执行此操作 示例代码: usi

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

HttpContext.Current.Request.Url.ToString()
如果启用了持久性功能,则httpcontext为空

是否有其他方法检索承载“我的代码”活动的WCF的URL?

您需要实现并将其添加到活动的上下文中。在OnReceiveMessage中,将传递当前操作上下文,允许您检查传入消息

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();
        }
    }
}
使用系统活动;
使用System.Runtime.Serialization;
使用System.ServiceModel;
使用System.ServiceModel.Activities;
命名空间声明性服务库2
{
公共密封类GetWCFMessageTo:NativeActivity
{
公共接收接收{get;set;}
公共输出参数WcfTo{get;set;}
受保护的覆盖无效执行(NativeActivityContext上下文)
{
Add(“ReceiveMessageCallback”,new ReceiveMessageCallback());
ScheduleActivity(Receive,CompletionCallback);
}
私有void CompletionCallback(NativeActivityContext上下文,ActivityInstance completedInstance)
{
var receiveMessageCallback=context.Properties.Find(“receiveMessageCallback”)作为receiveMessageCallback;
Set(context,receiveMessageCallback.WcfRequestTo);
}
}
[数据合同]
类ReceiveMessageCallback:IReceiveMessageCallback
{
公共字符串WcfRequestTo{get;private set;}
ReceiveMessage(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>

真的
[数据]
[“已接收”&;数据&;WCF至标题:“&;WcfRequestTo]

我对这种方法有两个问题:1)这种方法只适用于本土活动,对吗?2) 在本例中,OnReceiveMessage方法没有返回值,我不知道如何将url返回到活动。您可以向活动添加OutArgument,并在工作流中使用它。请参阅更新的应答器中的示例代码,它可以工作!谢谢。一般来说,这种方法比其他方法更复杂,例如在MOSS运行时的WF3.5中使用的方法。我希望能尽快开发出更有用的内置活动,或者简化整个框架,引入“环境上下文”例如,现在我希望像你这样的人能帮助像我这样的新手:)@Maurice我是否可以使用设计器中可用的
IReceiveMessageCallback
界面和
Receive
活动?