2010-12-20 39 views
2

Biztalk調用SOAP Web服務時發生問題。來自一個特定系統的Web服務似乎並不總是在Content-Type響應頭中包含「字符集」屬性。在這種情況下,字符集被解釋爲Windows-1252編碼,而不是UTF-8。從Biztalk調用的webservices中的字符集編碼問題

即使缺少「charset」屬性,來自Web服務器的響應實際上是UTF-8編碼。所以我的問題是,如果在服務的HTTP響應頭中沒有指定charset時,是否有可能告訴Biztalk UTF-8應該用作默認字符集。

只是進一步明確:如果下面的頭從Web服務返回 ,Biztalk的正確解釋的字符集:

Content-Type: text/xml; charset=UTF-8 

但是字符集部分缺失時,Biztalk的回落在Windows-1252編碼和一些國際字符亂碼:

Content-Type: text/xml 

我知道最簡單的解決辦法是解決Web服務總是返回UTF-8字符集屬性,但可悲的是,我們有過SER沒有控制惡意軟件和供應商不會很快發佈修復程序。

我們嘗試過的另一個修補程序是在IIS中使用重寫來重寫響應標頭。這可以正常工作,除非服務返回大量數據。在這種情況下,IIS將使用分塊編碼,而重寫引擎似乎將來自Web服務的輸出進行雙重塊編碼,從而導致輸出結果被破壞。

我到目前爲止工作的唯一解決方案是使用Apache Web服務器作爲代理,並使用Apache重寫頭。這是有效的,但是由於它引入了額外的開銷並且相當噁心,所以我們寧願在現有的端點上解決問題。目前Biztalk結束是我們唯一可以進行更改的人員。

我希望任何人都可以幫助我。

+0

正如其他人的評論我很驚訝的是,BTS將其視爲1252,因爲它通常默認爲UTF-8。你能詳細說明你如何以及在哪裏看到這個問題?通常BTS可以通過編碼來引導,以通過XMLNORM屬性來使用/假設,但究竟如何適用於您的場景取決於詳細信息,即消息流 – 2010-12-21 16:29:23

回答

0

一個簡單的解決方案是在接收管道中使用編碼轉碼器自定義流水線組件。這是,恕我直言,比在第三方服務器託管一個單獨的代理更好。但是你是對的,如果你能掌握外部Web服務,從根本上解決問題會更好。

這樣的composent在那裏可以找到: http://maximelabelle.wordpress.com/category/pipeline-components/

+0

我真的希望有一種設置可以指定默認編碼。問題不在於源數據的編碼;它不需要任何轉碼,因爲它已經是UTF-8了。如果在Web服務的HTTP響應頭中沒有指定編碼,我們只需要告訴Biztalk它應該假設XML是UTF-8編碼的。 – 2010-12-20 21:51:37

+0

據我所知,在沒有其他明確提及的情況下,BizTalk *會採用UTF-8編碼。 http://msdn.microsoft.com/en-us/library/aa559602(BTS.20).aspx。如果你確實觀察到了windows-1252輸入,這意味着它已經明確地被web服務錯誤地指定了。在這種情況下,您需要類似於m'y建議的解決方案...... – 2010-12-21 00:17:06

+0

我已經使用SoapUI測試了Web服務,並且使用Wireshark完成了數據包捕獲,並且Web服務的輸出在兩種情況下都明確爲UTF-8。唯一的區別似乎是Content-Type標題中缺少的字符集屬性。 – 2010-12-21 10:58:17