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

本文关键字:请求 失败 HTTP 错误 API 编码 我的 Web ASP 字符 | 更新日期: 2023-09-27 18:18:38

我有一个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捕获流量并检查原始请求时。对于不返回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重试请求(将插入到Fiddler在原始请求中删除它的地方)时,调用成功了。5)我在http://www.iana.org/assignments/media-types/media-types.xhtml上验证了我的Content-Type,并明确指定了utf8字符集。

所以这对我来说似乎是一个编码问题,但应该是一个有效的UTF-8字符。我在Jon Skeet页面上的Unicode Explorer小部件中验证了它。所以我不知道为什么这会引起问题。

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

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

<>之前的客户端。Encoding = Encoding. utf8;