2012-04-19 74 views
4

我的.NET ASMX web服務正在接受來自客戶端的請求,我沒有直接控制權。它發送看起來像這樣的請求:ASMX Web服務在傳入請求中使用錯誤編碼

POST /Service.asmx HTTP/1.1 
Connection: Keep-Alive 
Pragma: no-cache 
Content-Length: 1382 
Content-Type: text/xml 
Accept: text/xml 
Host: localhost 
User-Agent: Borland SOAP 1.1 
SOAPAction: "http://domain.com/InsertRecords" 

<?xml version="1.0"?> 
<SOAP-ENV:Envelope... <v>ÄLMÅ BÄCK</v></SOAP-ENV:Envelope> 

在我的WebMethod,串ALMA背後被被改寫的,以?? ?? LM B ?? CK - 典型的編碼混亂。

在我的測試,我發現,如果我只是調整了Content-Type頭,一切都很好:

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

爲什麼.NET選擇比其他的編碼UTF-8時,它的不確定,以及有什麼辦法可以強制這個ASMX使用UTF-8編碼嗎?

回答

2

調用Web服務處理程序之前下面的代碼運行導致正確解碼的HTTP請求:

if (HttpContext.Current.Request.ContentType == "text/xml") { 
    HttpContext.Current.Request.ContentType = "text/xml; charset=UTF-8"; 
} 

這感覺有點哈克,但我相信它會爲我的情況下工作。我仍然對一些關於爲什麼這是一個問題的背景信息非常感興趣,並且如果有更好的方法來解決這個問題(除了讓客戶端更清楚地瞭解編碼)。

1

IIS 7.5有配置選項來幫助完成此操作。 (我不知道早期版本是否支持這一點)。我有一個類似的問題,我有一個Web應用程序,它接收來自系統的請求,該系統使用擴展ASCII字符集的高5個字符作爲有意義的分隔符。這些正在通過IIS應用於傳入請求的解碼而變得枯燥。我發現了一些IIS配置選項來解決這個問題。


首先,在IIS管理器,選擇您的網站並打開.NET全球化設置:

IIS .NET Globalization Settings


有針對文件,請求,響應頭預期的編碼設置和迴應。有幾十個編碼選項可供選擇:

Setting encodings in IIS


這對我的情況下完美地工作,因爲這個特殊的網站只接受來自我寫了一個程序的要求,所以我控制的兩端。有了一個不知名的受衆,你只希望你的用戶適當地編碼他們的請求。 (但是,即使您使用默認編碼,也是如此......)