6

我的 .NET 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 中,字符串 ÄLMÅ BÄCK 被转换为 ??LM?? B??CK——典型的编码混乱。

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

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

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

4

2 回答 2

4

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

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

这感觉有点骇人听闻,但我相信它适合我的情况。我仍然对一些关于为什么这是一个问题的背景信息非常感兴趣,以及是否有更好的方法来解决这个问题(除了让客户更明确地了解编码)。

于 2012-04-19T03:39:43.193 回答
1

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


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

IIS .NET 全球化设置


有文件、请求、响应标头和响应的预期编码设置。有数十种编码选项可供选择:

在 IIS 中设置编码


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

于 2013-10-14T20:48:57.183 回答