字符编码导致我的ASP Web API请求失败,HTTP 400:错误请求
本文关键字:请求 失败 HTTP 错误 API 编码 我的 Web ASP 字符 | 更新日期: 2023-09-27 18:18:38
我有一个json对象,我序列化和发布。我发现,如果我的json对象的字符串成员之一有一些unicode字符,如
下面是如何调用的简化代码:
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捕获流量并检查原始请求时。对于不返回400错误的unicode字符,它们被替换为'?但是,对于那些确实导致400的人,它们显示为空白。但JSON视图显示为空字符' '
3) HTTP 400返回的是ASP Web API不能正确反序列化对象,所以我尝试使用Newtonsoft库来序列化和反序列化对象,这工作得很好。(ASP Web API的默认序列化器是JSON。所以它应该执行相同的序列化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重试请求(将
所以这对我来说似乎是一个编码问题,但应该是一个有效的UTF-8字符。我在Jon Skeet页面上的Unicode Explorer小部件中验证了它。所以我不知道为什么这会引起问题。
正如@roeland和@dbc指出的那样,在WebClient
上有一个Encoding
属性。将其设置为Encoding.UTF8
已解决此问题。