Webサービスを呼び出す必要があるSilverlightクライアントがあります。WebサービスはJavaで構築されており、XOPエンコーディングを使用して、その呼び出しの一部にバイナリメッセージを添付します。ただし、Silverlightサービスは、バイナリエンコーディングを含まない呼び出しのみを使用します。ただし、Webサービスを制御できないため、XOPマルチパートメッセージを処理する必要があります(例を以下に示します)。
Webサービスからの応答例(データが削除されました)
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:890535d9-d11f-4dfb-8393-789e20ea8064"; start="<root.message@cxf.apache.org>"; start-info="text/xml"
Date: Thu, 27 Jan 2011 22:03:09 GMT
Content-Length: 47247
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:Response xmlns:ns2="http://tempuri.com/"></ns2:Response>
</soap:Body>
</soap:Envelope>
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064--
現在の実装では、文字列置換を使用して手動でsoapメッセージを作成し、WebClientクラスを使用して要求を送信し、応答を文字列としてダウンロードします。その後、データをXMLとして手動で解析することに固執します。これは問題ありませんが、少し難しいので、とにかくそのためのRESTサービスを利用できます。サービスプロキシがオブジェクトで応答することを本当に望んでいます。
私が本当にやりたいのは、WSスタックがSOAPを逆シリアル化してXOPガンクを削除しようとする前にメッセージをインターセプトするカスタム動作を実装することですが、これまでのところ、そのようなことを可能にするものは何も見つかりませんでした。
私の見方では、いくつかの選択肢があります。
サーバー(私が制御する)にプロキシサービスを作成します。このプロキシサービスは、Javaサービスに要求を再送信し、実際にXOPを処理できます。このオプションは、私が避けたいパフォーマンスへの影響があります。
XOPを処理するカスタムMessageEncodingBindingElement、MessageEncoderFactory、およびMessageEncoderを実装します。このオプションは最初は最適のように見えますが、TextMessageEncoderFactoryまたはTextMessageEncoder(これらは内部クラスです)を拡張できないため、基本的にメッセージエンコーディング全体を最初から書き直す必要があります(Microsoftに感謝します)。
そのままにしておきます。
表示されていないオプションはありますか?