2013-09-29 16 views
6

Przekształcam kod z użycia HttpWebRequest na HttpClient. Jednym z problemów, który mam, jest pobranie zestawu znaków z nagłówka odpowiedzi typu zawartości.Czy zestaw znaków Content-Type nie jest odsłonięty z HttpResponseMessage?

Podczas korzystania HttpWebRequest, charset jest narażona w nieruchomości HttpWebResponse.CharacterSet, jak to

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

Można również dostać się do niej z WebResponse.ContentType nieruchomości lub z nagłówka Content-type w HttpWebResponse.Headers.

Przy użyciu HttpClient, zestaw znaków wydaje się być brakuje w nagłówku ContentType.

Oto kod, który używam do HttpClient:

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

właściwość charset jest zawsze null. HttpResponseMessage ma właściwość Headers, ale nie zawiera nagłówka typu treści. HttpResponseMessage.Content ma również właściwość Headers, która wydaje się zawierać nagłówek typu zawartości, ale ten nagłówek pokazuje "Content-Type: text/html" - nie ma części zestawu znaków.

Używając pierwszego podejścia z HttpWebResponse dla tego samego adresu URL, otrzymuję część zestawu znaków nagłówka Content-Type. Czy czegoś brakuje?

+0

Hej, zapraszamy do przepełnienie stosu. FYI, możesz wydrukować takie słowa, jak 'HttpResponseMessage', poprzez zamknięcie ich w backtickach' '. –

Odpowiedz

0

Wierzę, że nagłówek Content-Type zwrócony z serwera musiałby zawierać "zestaw znaków", taki jak 'text/html;charset=UTF-8', aby mógł pojawić się we właściwości CharSet. Pomocne może być sprawdzenie surowej odpowiedzi w narzędziu takim jak Fiddler (http://www.telerik.com/fiddler).

Dziękuję za pomoc w znalezieniu miejsca, w którym nagłówek Content-Type został pochowany w obiekcie HttpResponseMessage!

0

HttpClient celowo nie wystawia zestawu znaków. Dokładnie, nie może. Jest on asynchroniczny, więc gdy łączy się z serwerem, czeka na odpowiedź. Nie ma informacji o zestawie znaków ani o czymkolwiek innym poza funkcją TransferEncoding w HttpResponseMessage, która nie zawiera niczego oprócz "chunk" lub "zip".

Aby uzyskać kodowanie treści odpowiedzi, należy odczytać ją do zmiennej, a następnie dokładnie obejrzeć.

0

Szukałem emitować charset Wewnątrz HttpResponseMessage a ponieważ pytanie to pierwszy na google i znalazłem odpowiedź kilka stron poniżej, tutaj jest kod

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