2012-04-19 75 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


这对我的情况下完美地工作,因为这个特殊的网站只接受来自我写了一个程序的要求,所以我控制的两端。有了一个不知名的受众,你只希望你的用户适当地编码他们的请求。 (但是,即使您使用默认编码,也是如此......)