2011-01-27 3 views
0

Webサービスを呼び出すために必要なSilverlightクライアントがあります。 WebサービスはJavaで構築され、XOPエンコーディングを使用してバイナリメッセージをその呼び出しの一部に添付します。ただし、Silverlightサービスは、バイナリエンコーディングを含まない呼び出しのみを使用します。しかし、私はWebサービスを制御することができないので、XOPのマルチパートメッセージ(以下に例を挙げます)を扱う必要があります。 WebサービスからSilverlight 3のWSレスポンスからXOP gunkを削除します。

例応答(データは取り除か)

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="<[email protected]>"; 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: <[email protected]> 

<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メッセージを作成し、要求をポストし、文字列として応答をダウンロードするためにWebクライアントクラスを使用します。私たちは、手動でデータをXMLとして解析することに固執しています。これは問題ありませんが、少し難しく、とにかくRESTサービスを利用できます。サービスプロキシがオブジェクトで応答するのが本当に好きです。

私が実際にやってみたいのは、WSスタックがSOAPを逆シリアル化してXOPの塊を削除しようとする前に、メッセージを傍受するカスタム動作を実装することですが、これまでのところ私は何もできないそんなこと。

  1. はJavaサービスへの要求を再送信するサーバー上のプロキシサービスを(私がコントロールすること)を作成し、実際にXOPを扱うことができます。

    私はそれを見る方法、私はいくつかのオプションを持っています。このオプションは、私が避けたい性能上の意味合いを持っています。

  2. XOPを処理するカスタムMessageEncodingBindingElement、MessageEncoderFactory、およびMessageEncoderを実装します。このオプションは最初は最高のようですが、TextMessageEncoderFactoryやTextMessageEncoder(内部クラスです)を拡張することができないため、基本的にはメッセージ全体をゼロから書き直す必要があります。

  3. そのまま残してください。

私には見えないオプションがありますか?

答えて

0

いいえ、他の方法はありません。

私は、WebClient.DownloadString()メソッドを使用するパススルーashxプロキシを実装し、SOAPだけを解析してレスポンスにプラグインすることにしました。これは十分な柔軟性が必要ですが、何よりもSilverlightの自動生成されたプロキシクラスを使用して、エンドポイントに自分のashxプロキシを使用させるだけで、メンテナンスがずっと簡単になります。

関連する問題