簡體   English   中英

字符編碼導致我的 ASP Web API 請求失敗並顯示 HTTP 400:錯誤請求

[英]Character Encoding causes my ASP Web API request to fail with HTTP 400: Bad Request

我有一個 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 視圖時,它顯示為空字符 ' '

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);

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 指出的那樣, WebClient上有一個Encoding屬性。 將此設置為Encoding.UTF8解決了該問題。

client.Encoding = Encoding.UTF8;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM