當POSTed內容到達api控制器的一個方法時,所有字符串都已經轉換爲CLR的內部2個字節,每個字符的Unicode表示使用System.Text.Encoding
,它應該與Content-Type頭中指定的字符集相匹配。
如果您在字符串變量/字段中看到帶有問號的鑽石,則爲時已晚,因爲這意味着Encoding
無法正確解析字節流,並將這些字符用作後備。請注意,對於'¬'和'£'字符,您都有完全相同的菱形符號。
不同Encoding
實現可能會使用不同的佔位符號,更具體地說,與默認使用普通問號的iso-8859-1編碼不同,具有問號符號的菱形是Utf8編碼的默認回退字符。因爲你看到菱形符號,它看起來像你的請求實際上由Utf8編碼處理,這是相當不尋常的,因爲你說Content-Type
指定8859-1。
在網頁API原始HTTP請求和響應的formatting/parsing由HttpConfiguration.Formatters
配置的System.Net.Http.Formatting.MediaTypeFormatter
後裔它默認配置爲具有以下四種情況進行處理:
[0]: {System.Net.Http.Formatting.JsonMediaTypeFormatter}
[1]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
[2]: {System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter}
[3]: {System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter}
每個那些有SupportedEncodings
屬性,確定格式器準備處理哪些編碼。默認情況下,前兩個配置爲處理Utf8和Unicode,即Utf16,但它們配置爲在輸入流中遇到錯誤而不是插入後備字符時引發異常。
#3,FormUrlEncodedMediaTypeFormatter
沒有使用SupportedEncodings
財產和公正處理任何根據的Content-Type
頭中指定的字符集,它在我的測試中正確處理解碼。
您可以啓用對Web API的跟蹤,以查看它是否會爲實際正在發生的事情提供一些提示,特別是在請求在處理api控制器之前正在處理的過程中發生任何異常情況時。
您的問題的另一個可能的原因可能是客戶端不能正確處理編碼,這意味着Content-Type
中指定的值與請求的實際字節流不匹配。您可以使用網絡分析器(如WireShark)或通過爲System.Net.Sockets啓用tracing來檢查原始流。
謝謝邁克爾。這是一個明確和詳細的答案,給了我更清晰的背景。關於這一點,我已經能夠通過訪問原始數據並清理它來排序我的問題。 :O) – Sulphy