ASMX Web服务在传入请求中使用错误编码
问题描述:
我的.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编码吗?
答
调用Web服务处理程序之前下面的代码运行导致正确解码的HTTP请求:
if (HttpContext.Current.Request.ContentType == "text/xml") {
HttpContext.Current.Request.ContentType = "text/xml; charset=UTF-8";
}
这感觉有点哈克,但我相信它会为我的情况下工作。我仍然对一些关于为什么这是一个问题的背景信息非常感兴趣,并且如果有更好的方法来解决这个问题(除了让客户端更清楚地了解编码)。
答
IIS 7.5有配置选项来帮助完成此操作。 (我不知道早期版本是否支持这一点)。我有一个类似的问题,我有一个Web应用程序,它接收来自系统的请求,该系统使用扩展ASCII字符集的高5个字符作为有意义的分隔符。这些正在通过IIS应用于传入请求的解码而变得枯燥。我发现了一些IIS配置选项来解决这个问题。
首先,在IIS管理器,选择您的网站并打开.NET全球化设置:
有针对文件,请求,响应头预期的编码设置和回应。有几十个编码选项可供选择:
这对我的情况下完美地工作,因为这个特殊的网站只接受来自我写了一个程序的要求,所以我控制的两端。有了一个不知名的受众,你只希望你的用户适当地编码他们的请求。 (但是,即使您使用默认编码,也是如此......)