Silverlight 3のWS応答からXop Gunkを削除します
-
26-10-2019 - |
質問
Webサービスに電話する必要があるSilverlightクライアントがいます。 WebサービスはJavaに組み込まれており、XOPエンコードを使用して、その呼び出しの一部にバイナリメッセージを添付しています。ただし、Silverlight Serviceは、バイナリエンコーディングを含まない呼び出しのみを使用します。ただし、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--
現在の実装は、文字列置換を使用して石鹸メッセージを手動で構築し、WebClientクラスを使用してリクエストを投稿し、応答を文字列としてダウンロードします。次に、データをXMLとして手動で解析することに固執します。これは大丈夫ですが、それは少し難しいです、そして、とにかくそれのために利用可能な休憩サービスがあります。サービスプロキシがオブジェクトで応答することを本当に望んでいます。
私が本当にやりたいのは、WSスタックが石鹸を脱着してXOPガンクを削除しようとする前にメッセージを傍受するカスタム動作を実装することですが、これまでのところ、私はそのようなことをすることを許すものを見つけました。
私がそれを見る方法、私にはいくつかの選択肢があります:
リクエストをJavaサービスに再送信し、実際にXOPを処理できるサーバーにプロキシサービスを作成します(私が制御します)。このオプションには、避けたいパフォーマンスの影響があります。
XOPを処理するカスタムMessageEncodingBindingElement、MessageEncoderFactory、およびMessageEncoderを実装します。このオプションは最初は最高のように思えますが、TextMessageEncoderFactoryまたはTextMessageEncoder(内部クラスです)を拡張できないため、基本的にはゼロからエンコードするメッセージ全体を書き直す必要があります(Microsoftに感謝します!)。
そのままにしておきます。
私が見ていないオプションはありますか?
解決
いいえ、他の選択肢はありません。
WebClient.DownLoadString()メソッドを使用するパススルーASHXプロキシを実装することにしました。それは十分に柔軟である必要があり、何よりも、私はSilverlightの自動生成プロキシクラスを使用するだけで、エンドポイントにAshxプロキシを使用するだけで、メンテナンスをより簡単にします。