我有一个 json 对象,我对其进行序列化和发布。我发现如果我的json对象的字符串成员之一有一些unicode字符,例如é、ó、6̄(我还有一些其他的unicode字符,犞犞不返回HTTP 400错误),请求返回HTTP 400错误的请求。

以下是有关如何进行调用的简化代码:

WebClient client;
Foo myObject = new Foo();
myObject.StringField1 = "é";
string serializedObjects = Newtonsoft.Json.JsonConvert.SerializeObject(myObject)
client.Headers[HttpRequestHeader.ContentType] = "application/json;charset=utf-8";
var response = client.UploadString(url, serializedObjects);

这是服务器端如何接收调用的代码:
public async Task<IHttpActionResult> Post([FromBody] IList<Foo> myObjects){}

以下是我研究/尝试过的一些事情以及我所做的一些假设:

1) 获取字符串对象为 UTF8 字节,然后将其转换回字符串
Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(serializedObjects))

2)当我发出请求并使用 Fiddler 捕获流量并在 Raw 中检查请求时。对于不返回 400 错误的 unicode 字符,它们被替换为“?”但是对于那些确实导致 400 的,它们显示为空白。但是,当我查看 JSON View 时,它显示为空字符“�”

3) 返回 HTTP 400 是 ASP Web API 无法正确反序列化对象,所以我尝试使用 Newtonsoft 库来序列化和反序列化对象,这很好用。 (ASP Web API 的默认序列化程序是 JSON.NET,因此它应该执行相同的序列化 http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization )
string b = JsonConvert.SerializeObject(a);
Foo c = (Foo) JsonConvert.DeserializeObject(b, typeof(Foo));
// And I tried deserializing using the generic method
Foo d = JsonConvert.DeserializeObject<Foo>(b);

4)我确信这是我的服务器拒绝这些特殊字符的问题,但是当我使用 Fiddler 重试请求(将 é 插入 Fiddler 在原始请求中将其从原始请求中删除的位置)时,调用成功。
5) 我在 http://www.iana.org/assignments/media-types/media-types.xhtml 上验证了我的 Content-Type 并且还明确指定了 utf8 字符集。

所以这在我看来是一个编码问题,但 é 应该是一个有效的 UTF-8 字符。我在 Jon Skeet 的页面上的 Unicode Explorer 小部件中对其进行了验证。所以我不知道为什么这会导致问题......

最佳答案

正如@roeland 和@dbc 指出的那样, Encoding 上有一个 WebClient 属性。将此设置为 Encoding.UTF8 解决了该问题。
client.Encoding = Encoding.UTF8;

关于c# - 字符编码导致我的 ASP Web API 请求失败并显示 HTTP 400 : Bad Request,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33246236/

10-10 00:48
查看更多