我有一個Silverlight客戶端,需要調用Web服務。 Web服務使用Java構建,並使用XOP編碼將二進制消息附加到某些調用中。但是,Silverlight服務僅使用不包含任何二進制編碼的調用。但是,由於我無法控制Web服務,因此我仍然必須處理XOP多部分消息 - (以下是一個例子)。從web服務從WS Response中刪除Silverlight 3中的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消息,並使用WebClient類張貼請求並下載響應爲字符串。然後我們堅持手動將數據解析爲XML。這很好,但有點困難,而且我們還有REST服務。我真的很喜歡服務代理來回應對象。
我真的很想做的是實現一個自定義行爲,它會在WS堆試圖反序列化SOAP並刪除XOP gunk之前攔截消息,但到目前爲止,我沒有發現任何事情可以讓我做這樣的事情。
我看到它的方式,我有幾個選擇:
在服務器上創建一個代理服務(我控制),將重新提交請求到Java服務,並可以實際處理XOP 。這個選項有我想避免的性能影響。
實現將處理XOP的自定義MessageEncodingBindingElement,MessageEncoderFactory和MessageEncoder。這個選項起初似乎是最好的,但由於我無法擴展TextMessageEncoderFactory或TextMessageEncoder(它們是內部類),我基本上需要從頭開始重寫整個消息編碼(非常感謝Microsoft!)。
保持原樣。
有沒有我沒有看到的選項?