2

MSMQ を使用する WCF サービスを作成しました。
複数の .NET クライアントがこのサービスを利用してメッセージを送信できる必要があります。
一部のクライアントは、WCF が存在しない .NET バージョン (.NET 1.1 など) で作成されています。
これらのクライアントには、Msmq API を直接使用します。
問題は、メッセージのエンコーディングがサービス側で期待されるエンコーディングに適合しないことです。
そこで、次を使用してサービス側でメッセージエンコーディングを変更しようとしましたcustomBinding:

<bindings>
    <customBinding>
        <binding name="MyCustomBinding">
            <!-- available encodings: -->
            <!-- <textMessageEncoding /> -->
            <!-- <binaryMessageEncoding /> -->
            <!-- <mtomMessageEncoding /> -->
            <!-- <webMessageEncoding /> -->

            <msmqTransport ...>
                <msmqTransportSecurity ... />
            </msmqTransport>
        </binding>
    </customBinding>
</bindings>

事前に定義された 4 つのエンコーディングのうちの 1 つに制限されていると思います: textMessageEncodingbinaryMessageEncoding、。mtomMessageEncodingwebMessageEncoding

クライアント側では、フォーマッタを変更しようとしました:

System.Messaging.Message msmqMessage = new System.Messaging.Message();
msmqMessage.Formatter = new System.Messaging.ActiveXMessageFormatter();
//msmqMessage.Formatter = new System.Messaging.BinaryMessageFormatter();
//msmqMessage.Formatter = new System.Messaging.XMLMessageFormatter();

予想されるエンコーディングに適合するフォーマッターがないようです。エンコーディングを統一する別の方法はありますか? おそらくカスタムエンコーダーかそのようなものでしょうか?または、フォーマッターとエンコーダーの調整が完全に間違っていますか?

前もって感謝します。

4

1 に答える 1

2

組み込みを使用してMsmqIntegrationBinding、シリアル化形式を xml に設定できます。

<service name="MyQueueListenner">
    <endpoint address="msmq.formatname:DIRECT=OS:.\private$\myQueue"
              binding="msmqIntegrationBinding"
              bindingConfiguration="DotNetBinding"
              contract="MyContract" />
  </service>
  ...

  <msmqIntegrationBinding>
    <binding serializationFormat="Xml" name="DotNetBinding" durable="false" exactlyOnce="false">
      <security mode="None" />
    </binding>
  </msmqIntegrationBinding>

アップデート

統合バインディングの全体的なポイントは、wcf が非 .Net msmq クライアント (ActiveX、Java) をサポートできるように、最大​​の相互運用性です。

このため、(文字列以外の) データ コントラクトを公開しても意味がありません。

MS は、下位の .Net バージョンと WCF の間の相互運用に人々がそれを使用することを本当に想像していなかったと思います。

私が提案できる唯一のことは、http を介して型を公開する一連の一方向操作を定義する mex エンドポイントをホストし、クライアントがこのエンドポイントから wsdl を使用できるようにすることです。

次に、これを使用して、msmq エンドポイントで使用するローカル型定義を構築できます。

実際に http 操作を呼び出したり、操作で NotImplementedException をスローしたりしてはならないことを明確にしてください。

于 2012-06-19T13:09:52.170 に答える