.net - 带有加扰的非 ASCII 字符的 JSONP 字符串

标签 .net wcf c#-4.0 jsonp

我在 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 http://localhost:31843/TestWebService/GetTestString 访问 Web 方法我得到正确的结果:

"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 范围之外的字符,则在某些浏览器配置中,文档将呈现乱码。文件的字符编码需要在传输中声明协议(protocol)或文件需要使用字节顺序标记作为编码签名。”

显然,这似乎是问题所在。但问题是,如何配置正确的编码(为什么默认不是UTF8)?

更新:

我认为 Microsoft .NET DataContractJsonSerializer 有一个错误。在 JSON 的第一种情况下,它发送以下 HTTP header :

Content-Type: application/json; charset=utf-8

通过指定 callback 使用 JSONP 时URL 参数,它发送:

Content-Type: application/x-javascript

因此没有指定字符编码,将字符集的决定留给浏览器。在互联网上进行一些研究后,我确信没有(简单的)方法可以强制 DataContractJsonSerializer 发送 Content-Type具有正确字符集的 HTTP header 。

最佳答案

我现在找到了一个非常简单的解决方案 - 可能有点人为 - 问题。

说明:我正在使用 JavaScript 框架为智能手机开发一个应用程序,所以它不是原生应用程序,而是在智能手机的浏览器引擎中运行。因此,所有 Web 内容(HTML、JavaScript、CSS 文件等)都在本地加载,而不是从 Web 服务器远程加载。这就是为什么没有合适的Content-Type带有字符集的 HTTP header ,因为根本没有 HTTP。在 index.html 文件中,它是应用程序的主页(唯一的),也没有指定字符集。所以浏览器假定了一些默认字符集,不幸的是不是 UTF-8。

所以对我来说简单的解决方案是通过添加以下行来指定 index.html 中的字符集:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

这样,嵌入的 JSONP 数据现在也可以正确显示,而无需明确指定 JSONP HTTP 响应的字符集。

当然,这并不能解决 Firefox 中的错误显示,如我上面的问题所述。但这并不重要,因为它只需要在智能手机的浏览器上正确显示。

关于.net - 带有加扰的非 ASCII 字符的 JSONP 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12057818/

相关文章:

c# - 如何使用构造函数参数测试是否存在 Action Filter?

WCF 和 WSE 2.0 网络服务

c# - C#4 中的动态关键字是否支持扩展方法?

c# - 使只读属性可设置

.net - 跨项目的部分类

iphone - 在 iPhone 和 Web 服务之间传输图像

c# - WSDL 生成的代码未正确反序列化 XML 中的 long

asp.net-mvc - JQuery 中的 MVC 空 ViewBag

.net - .NET 4.0 文件系统枚举功能的奇怪之处

c# - 线程跨应用程序域的简单示例?