1

MsmqIntegrationBinding について学習しています。これまで見てきたすべてのサンプルとガイドラインは、1 つのデータ コントラクトで 1 つの操作しかないシナリオをカバーしていました。別の契約を追加しようとしましたが、サービスは正常に開始されました。ただし、2番目の操作に到達する方法がわかりません。このバインディングでもそのようなことは可能ですか?

[ServiceContract]
[ServiceKnownType(typeof(Data1))]
[ServiceKnownType(typeof(Data2))]
public interface ISampleService
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void Operation1(MsmqMessage<Data1> msg);

    [OperationContract(IsOneWay = true)]
    void Operation2(MsmqMessage<Data2> msg);
}

public class SampleService : ISampleService
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void Operation1(MsmqMessage<Data1> msg)
    {
        var data = msg.Body;
    }

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void Operation2(MsmqMessage<Data2> msg)
    {
        var data = msg.Body;
    }
}

呼び出しコード

var queue = new MessageQueue(@".\private$\samplequeue");
var body = new Data1() { Data = "some data" };
var message = new Message(body);
message.Label = "some label";
queue.Send(body, MessageQueueTransactionType.Single);

これにより、Action が「*」に設定された Operation1 が起動されます。

4

2 に答える 2

1

これは非常に興味深い質問です。

Action OperationContractAttribute は通常、WS-Addressing SOAP ヘッダーを設定するために WCF スタックによって使用されます。その使用は、キューに入れられたバインディングによって何らかの方法で明らかにオーバーライドされます。

フィルターのように機能する Action 属性に基づいて msmq メッセージ ヘッダーを操作にマッピングできる WCF の文書化されていない機能がある可能性がありますが、ある場合、それがどのような形式になるかはわかりません。

最も簡単な説明は次のとおりだと思います: いいえ、それは不可能です。その理由は、msmqIntegrationBinding がまさにそのブリキに記載されているとおりであるためです。これは、相互運用機能に関するものです。

MsmqMessage ラッパーを使用して操作を呼び出さなければならないため、このバインドは意味的に 1 次元になります。これは、レガシー COM および ActiveX クライアントとの相互運用をサポートするために単一のエンドポイント操作をラップすることを意図しているという私の理論に役立ちます。

とにかく、特定のバインディングがコールバックをサポートせず、特定のバインディングが一方向の操作のみをサポートするように、バインディングが複数の操作をサポートしなければならないという法律はありません。

これがあなたの質問に直接答えないことを理解してください。

于 2013-05-15T12:33:47.283 に答える