簡體   English   中英

Content-Type 字符集是否未從 HttpResponseMessage 公開?

[英]Is the Content-Type charset not exposed from HttpResponseMessage?

我正在將一些代碼從使用HttpWebRequest轉換為HttpClient 我遇到的一個問題是從內容類型響應 header 獲取字符集。

使用HttpWebRequest時,字符集在HttpWebResponse.CharacterSet屬性中公開,如下所示

using (WebResponse response = await this.webRequest.GetResponseAsync())
{
     string characterSet = ((HttpWebResponse)response).CharacterSet;

您還可以從WebResponse.ContentType屬性或從HttpWebResponse.Headers中的內容類型 header 獲取它。

使用HttpClient時, ContentType header 中似乎缺少字符集。

這是我用於HttpClient的代碼:

using (HttpClient httpClient = new HttpClient(httpClientHandler))
{
    using (HttpResponseMessage httpResponseMessage = await httpClient.GetAsync(uri, HttpCompletionOption.ResponseContentRead))
    {
        charset = httpResponseMessage.Content.Headers.ContentType.CharSet;

CharSet 屬性始終為null HttpResponseMessage有一個Headers屬性,但它不包含內容類型HttpResponseMessage.Content也有一個 Headers 屬性,它似乎包含內容類型 header,但 header 顯示"Content-Type: text/html" - 它沒有字符集部分。

對同一個 url 使用HttpWebResponse的第一種方法,我得到了 Content-Type header 的字符集部分。我錯過了什么嗎?

我想在 HttpResponseMessage 中發出字符集,因為你的問題是谷歌上的第一個問題,我在下面幾頁找到了答案,這里是代碼

httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
httpResponseMessage.Content.Headers.ContentType.CharSet = Encoding.UTF8.HeaderName;
httpResponseMessage.Content.Headers.Add("CodePage", Encoding.UTF8.CodePage.ToString());

您可以通過以下方式獲取:

var contentType = response.Content.Headers.GetValues("Content-Type").First());

我相信從服務器返回的Content-Type標頭必須包含像'text/html;charset=UTF-8'這樣的'text/html;charset=UTF-8' ,以便它顯示在CharSet屬性中。 在像 Fiddler ( http://www.telerik.com/fiddler ) 這樣的工具中檢查原始響應可能會有所幫助。

感謝您幫助我找到HttpResponseMessage對象中Content-Type標頭的位置!

HttpClient 有意不公開字符集。 確切地說,它不能。 它是異步的,所以當它連接到服務器時,它會等待直到響應。 它不知道字符集或除 HttpResponseMessage 中的 TransferEncoding 之外的任何其他內容,它不包含除“chunk”或“zip”之外的任何內容。

因此,要獲得響應主體的編碼,我們應該將其讀取到變量中,然后仔細查看。

由於 Content-Type 可以是類型數組,您可能想檢查其中任何一個的有效性,但這是假設服務器編寫正確並且不會混合類型和字符集

var isJson = response.Content.Headers.GetValues("Content-Type").Any(x=>x.Contains("json"));

var isCharsetUTF8 = response.Content.Headers.GetValues("Content-Type").Any(x=>x.Contains("charset=UTF-8"));

暫無
暫無

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

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