gpt4 book ai didi

c# - 字符编码导致我的 ASP Web API 请求失败并显示 HTTP 400 : Bad Request

转载 作者:行者123 更新时间:2023-11-30 20:21:46 33 4
gpt4 key购买 nike

我有一个我序列化并发布的 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 上验证了我的内容类型并明确指定 utf8 字符集。

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

最佳答案

正如@roeland 和@dbc 所指出的,WebClient 上有一个Encoding 属性。将其设置为 Encoding.UTF8 解决了这个问题。

client.Encoding = Encoding.UTF8;

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com