1

ワークフローがホストされ(WF4 + WCF)、IISで実行されている場合、次のインターフェイスを実装します。

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

(を使用RecieveActivityしてSendReplyからSystem.ServiceModel.Activities

そして、次のように呼び出します。

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

その後answer、常にnullです。WcfTestClientを介してワークフローを使用すると、返されるxmlオブジェクトがあることがわかります。

ワークフローに入力する文字列を返すようにするにはどうすればよいanswerですか?

(「ServiceReferenceを追加して大量のxmlアプローチを返す」は避けたい)

4

1 に答える 1

5

[return]結果を見つける方法を指定する属性が必要です。

で、を返送するかSendReplyToReceive、を返送するMessageかを選択できますParameters。私の経験では、選択する必要がありますParametersが、返送するのは1つだけです。戻りパラメーターに「result」という名前を付けるとすると、インターフェースコントラクトに次の属性が必要になります。

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

これが私の1つの完全な例です。

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を指定しないことでどのように回避できるかわかりませんが、それは素晴らしいことです。指定する必要のある形式がコントラクトとワークフローで異なるため、これらは非常に苦痛です。

また、わからない場合に備えて、非常に微妙なバグが発生する可能性があります。渡したパラメーターは名前で認識されるため、インターフェースのインバウンドパラメーターに指定する名前がワークフロー。あなたがそれについて考えるとき明らかですが、あなたを捕まえることができます。ああ、誤解を招くエラーメッセージで壊れてしまうので、長すぎるメソッド名は避けてください。

于 2012-06-05T18:32:58.367 に答える