2011-01-27 33 views
0

我有一個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之前攔截消息,但到目前爲止,我沒有發現任何事情可以讓我做這樣的事情。

我看到它的方式,我有幾個選擇:

  1. 在服務器上創建一個代理服務(我控制),將重新提交請求到Java服務,並可以實際處理XOP 。這個選項有我想避免的性能影響。

  2. 實現將處理XOP的自定義MessageEncodingBindingElement,MessageEncoderFactory和MessageEncoder。這個選項起初似乎是最好的,但由於我無法擴展TextMessageEncoderFactory或TextMessageEncoder(它們是內部類),我基本上需要從頭開始重寫整個消息編碼(非常感謝Microsoft!)。

  3. 保持原樣。

有沒有我沒有看到的選項?

回答

0

不,沒有其他的選擇。

我決定實現一個傳遞ashx代理,它將使用WebClient.DownloadString()方法,然後解析出SOAP並將其插入到響應中。它應該足夠靈活,最重要的是,我可以使用Silverlight中的自動生成的代理類,然後讓端點使用我的ashx代理 - 這使得維護更簡單。