ASMX Web服务对传入请求使用错误编码

时间:2012-04-19 02:55:17

标签: asp.net web-services encoding character-encoding asmx

我的.NET ASMX webservice正在接受来自我无法直接控制的客户端的请求。它正在发送一个如下所示的请求:

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中,字符串ÄLMÅBÄCK被提供给?? ?? B ?? CK - 典型的编码混乱。

在我的测试中,我发现如果我只是调整内容类型的标题,一切都很好:

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

为什么.NET在未指定时选择utf-8以外的编码,有什么方法可以强制使用这个ASMX来使用UTF-8编码?

2 个答案:

答案 0 :(得分:2)

在调用Web服务处理程序之前运行以下代码会导致HTTP请求被正确解码:

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

这感觉有点hacky,但我相信它对我的情况会很好。我仍然对一些背景信息非常感兴趣,这些信息根本就是为什么这是一个问题,如果有更好的方法来解决这个问题(除了让客户端更加明确地编码)。

答案 1 :(得分:1)

IIS 7.5具有配置选项来帮助解决此问题。 (我不知道早期版本是否支持这一点。)我有一个类似的问题,我有一个Web应用程序接收来自系统的请求,该系统使用扩展ASCII字符集的高5个字符作为有意义的分隔符。这些是由IIS正在应用于传入请求的解码所得到的。我找到了一些IIS配置选项来解决这个问题。


首先,在IIS管理器中,选择您的网站并打开.NET全球化设置:

IIS .NET Globalization Settings


有针对文件,请求,响应标头和响应的预期编码的设置。有许多编码选项可供选择:

Setting encodings in IIS


这对我的场景非常有效,因为这个特定站点只接收了我编写的程序的请求,所以我控制了两端。对于未知的受众,您只是希望您的用户适当地编码他们的请求。 (但是,即使你使用默认编码也是如此......)