我在 C# 4.0 中有一个小型 Web 服务,它通过 JSONP 返回数据。我遇到的问题是非 ASCII 字符——比如德语变音符号(ä、ö、ü)——在到达客户端时会被打乱。以下简化代码说明了这一点:
// The interface
[OperationContract]
[WebGet( ResponseFormat = WebMessageFormat.Json )]
string GetTestString();
//...
// The implementation
public string GetTestString()
{
return "String with some German characters: äöüß";
}
现在,如果我通过 Firefox 通过输入 URL 访问 Web 方法,http://localhost:31843/TestWebService/GetTestString
我会得到正确的结果:
"String with some German characters: äöüß"
但是,如果我callback
在 URL ( http://localhost:31843/TestWebService/GetTestString?callback=Test
) 中指定参数,这就是 JSONP 所做的,我会得到一个打乱的结果:
Test("String with some German characters: äöüß");
JSONP 序列化程序是我通过webHttpBinding.CrossDomainScriptAccessEnabled = true;
在我的代码中设置激活的 Microsoft .NET 4.0 框架的序列化程序。我没有找到任何方法来影响该序列化程序的字符编码。你有什么想法?
另一个提示:对带有乱码的 JSONP 字符串的 Web 请求后,Firebug 在控制台上显示以下错误:
“未声明纯文本文档的字符编码。如果文档包含 US-ASCII 范围之外的字符,则在某些浏览器配置中,文档将呈现乱码。文件的字符编码需要在传输中声明协议或文件需要使用字节顺序标记作为编码签名。”
显然,这似乎是问题所在。但问题是,如何配置正确的编码(为什么默认不是UTF8)?
更新:
我认为 Microsoft .NET DataContractJsonSerializer 有一个错误。在 JSON 的第一种情况下,它发送以下 HTTP 标头:
Content-Type: application/json; charset=utf-8
通过指定 URL 参数使用 JSONP 时callback
,它会发送:
Content-Type: application/x-javascript
因此没有指定字符编码,将字符集的决定留给浏览器。在互联网上进行一些研究后,我确信没有(简单的)方法可以强制 DataContractJsonSerializer 发送Content-Type
带有适当字符集的 HTTP 标头。