2013-09-29 21 views
6

我將使用HttpWebRequest的部分代碼轉換爲HttpClient。我遇到的一個問題是從內容類型的響應頭獲取字符集。是否從HttpResponseMessage公開Content-Type字符集?

當使用HttpWebRequest,字符集暴露在HttpWebResponse.CharacterSet屬性,這樣

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

您也可以從WebResponse.ContentType財產或從Content-Type頭在HttpWebResponse.Headers得到它。

使用HttpClient,字頭似乎從ContentType標題中缺失。

下面是我使用HttpClient代碼:

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

的字符集屬性始終nullHttpResponseMessage具有Headers屬性,但它不包含內容類型標題。 HttpResponseMessage.Content也有一個Headers屬性,它看起來包含內容類型的標題,但該標題顯示"Content-Type: text/html" - 它沒有charset部分。

使用第一種方法與HttpWebResponse爲相同的URL,我得到Content-Type標頭的字符集部分。我錯過了什麼嗎?

+0

嗨,歡迎堆棧溢出。僅供參考,您可以逐字打印「HttpResponseMessage」之類的東西,方法是將它們放入反引號中。 –

回答

0

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

並感謝幫助我找到Content-Type標題被埋在HttpResponseMessage對象中!

0

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

所以爲了得到響應體的編碼,我們應該把它讀到一個變量中,然後仔細觀察。

0

我一直在尋找發出內部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()); 
相關問題