小编Kei*_*ith的帖子

字符编码导致我的ASP Web API请求失败,出现HTTP 400:错误请求

我有一个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);
Run Code Online (Sandbox Code Playgroud)

以下是服务器端如何接收呼叫的代码:

public async Task<IHttpActionResult> Post([FromBody] IList<Foo> myObjects){}
Run Code Online (Sandbox Code Playgroud)

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

1)将字符串对象作为UTF8字节获取,然后将其转换回字符串

Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(serializedObjects))
Run Code Online (Sandbox Code Playgroud)

2)当我发出请求并使用Fiddler捕获流量并检查Raw中的请求时.对于不返回400错误的unicode字符,它们将替换为"?" 但是对于导致400的那些,它们显示为空白.但是,当我查看JSON视图时,它显示为空字符' '

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-序列化)

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);
Run Code Online (Sandbox Code Playgroud)

4)我确信这是我的服务器拒绝这些特殊字符的问题,但是当我使用Fiddler重试请求(将Fé插回到Fiddler在原始请求中将其删除的地方)时,调用成功.5)我在http://www.iana.org/assignments/media-types/media-types.xhtml上验证了我的内容类型,并明确指定了utf8字符集.

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

c# asp.net unicode json utf-8

2
推荐指数
1
解决办法
5090
查看次数

标签 统计

asp.net ×1

c# ×1

json ×1

unicode ×1

utf-8 ×1