当ChannelFactory接口调用时,如何从WCF工作流(WF4)返回字符串?

Jon*_*ved 1 c# wcf workflow-foundation-4

如果我有托管的工作流程(WF4 + WCF)并在IIS中运行,则实现以下界面:

[ServiceContract]
public interface IMessageService
{   
     [OperationContract]
     string SendMessage(string message);
}
Run Code Online (Sandbox Code Playgroud)

(使用RecieveActivitySendReply来自System.ServiceModel.Activities)

并像这样调用它:

    var channel = new ChannelFactory<IMessageService>().CreateChannel(<init params>);
    string answer = channel.SendMessage("Testmessage");
Run Code Online (Sandbox Code Playgroud)

然后answer总是为空.如果我通过WcfTestClient使用工作流程,我可以看到有一个返回的xml对象.

如何让工作流返回一个字符串来填充answer

(我想避免"添加一个ServiceReference并返回很多xml-approach")

Fra*_*ans 5

您需要一个[return]属性来指定如何查找结果.

SendReplyToReceive你可以选择发回一个MessageParameters.根据我的经验,你需要选择Parameters但只发回一个.假设你给return参数命名为"result",那么你需要在你的接口契约中使用这个属性:

[return: MessageParameter(Name = "result")]
Run Code Online (Sandbox Code Playgroud)

这是我的一个完整的例子;

namespace NewOrbit.ExVerifier.Model.Workflow.Case
{
    using System;
    using System.ServiceModel;

    using NewOrbit.ExVerifier.Model.Workflow;

    [ServiceContract(Namespace = "urn://exverifier.neworbit.co.uk/")]
    public interface ICaseWorkflow
    {
        [OperationContract(Action = "urn://exverifier.neworbit.co.uk/NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow/Start",
            ReplyAction = "urn://exverifier.neworbit.co.uk/NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow/StartReply")]
        [return: MessageParameter(Name = "result")]
        WorkflowInstanceIdentifier Start(int caseID);

        [OperationContract(Action = "urn://exverifier.neworbit.co.uk/NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow/ApplicationStateChanged",
            ReplyAction = "urn://exverifier.neworbit.co.uk/NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow/ApplicationStateChangedReply")]
        [return: MessageParameter(Name = "result")]
        bool ApplicationStateChanged(Guid instanceID, int applicationID);

        [OperationContract(Action = "urn://exverifier.neworbit.co.uk/NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow/Cancel",
            ReplyAction = "urn://exverifier.neworbit.co.uk/NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow/CancelReply")]
        [return: MessageParameter(Name = "result")]
        bool Cancel(Guid instanceID);
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,在你的例子中,我不确定你是如何逃避未指定OperationContract但是你很好 - 他们真的很痛苦,因为你必须指定它们的格式在合同和工作流程中是不同的.

另外,万一你不知道,它可能会导致一些非常微妙的错误:你传递的参数的名字被识别,所以它是imprtant这个名字你指定在接口的入站的参数是相同的流程.当你想到它但是可以抓住你时显而易见.哦,并避免方法名称太长,因为它们会破坏错误的错误消息.