如何从 WCF 工作流 (WF4) 返回字符串时由具有通道工厂的接口调用

本文关键字:通道 由具有 工厂 调用 接口 字符串 返回 WCF 工作流 WF4 | 更新日期: 2023-09-27 18:36:26

如果我有一个工作流托管(WF4 + WCF)并在IIS中运行,实现以下接口:

[ServiceContract]
public interface IMessageService
{   
     [OperationContract]
     string SendMessage(string message);
}

(使用System.ServiceModel.Activities RecieveActivitySendReply

并像这样调用它:

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

answer始终为空。如果我通过 WcfTestClient 使用工作流,我可以看到有一个返回的 xml 对象。

如何使工作流返回字符串以填充answer

(我想避免"添加服务引用并返回大量 xml 方法")

如何从 WCF 工作流 (WF4) 返回字符串时由具有通道工厂的接口调用

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

SendReplyToReceive中,您可以选择发回MessageParameters。根据我的经验,您需要选择Parameters但只能发回一个。假设您为返回参数命名为"result",那么您在接口协定中需要此属性:

[return: MessageParameter(Name = "result")]

这是我的一个完整示例;

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);
    }
}

顺便说一句,在您的示例中,我不确定您如何摆脱不指定 OperationContract 但您很高兴 - 它们真的很痛苦,因为您必须指定它们的格式在合同和工作流程中是不同的

另外,以防万一您不知道,它可能会导致一些非常微妙的错误: 您传入的参数由名称识别,因此您在界面中为入站参数指定的名称与工作流中的名称相同。当你想到它时,很明显,但可以让你出局。哦,并避免使用过长的方法名称,因为它们也会因误导性错误消息而中断。

相关文章: