Является ли кодировка Content-Type недоступной из HttpResponseMessage?
Я конвертирую код из HttpWebRequest
в HttpClient
. Одна из проблем, с которой я столкнулась, - это получить кодировку из заголовка ответа типа содержимого.
При использовании HttpWebRequest
кодировка отображается в свойстве HttpWebResponse.CharacterSet
, например,
using (WebResponse response = await this.webRequest.GetResponseAsync())
{
string characterSet = ((HttpWebResponse)response).CharacterSet;
Вы также можете перейти к нему из свойства WebResponse.ContentType
или из заголовка содержимого в 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;
Свойство CharSet всегда null
. HttpResponseMessage
имеет свойство Headers
, но не содержит заголовок содержимого. HttpResponseMessage.Content
также имеет свойство Headers, которое, как представляется, содержит заголовок типа содержимого, но этот заголовок показывает "Content-Type: text/html"
- он не имеет части charset.
Используя первый подход с HttpWebResponse
для одного и того же URL-адреса, я получаю часть кодировки заголовка Content-Type. Я что-то пропустил?
Ответы
Ответ 1
Я искал charset внутри HttpResponseMessage, и поскольку ваш вопрос является первым в google и что я нашел ответ на несколько страниц ниже, вот код
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());
Ответ 2
Я полагаю, что заголовок Content-Type
, возвращенный с сервера, должен содержать "charset", например 'text/html;charset=UTF-8'
, чтобы он отображался в свойстве CharSet
. Проверка исходного ответа в инструменте, таком как Fiddler (http://www.telerik.com/fiddler), может помочь.
И спасибо, что помогли мне найти, где заголовок Content-Type
был похоронен в объекте HttpResponseMessage
!
Ответ 3
HttpClient намеренно не раскрывает кодировку. Точно это не может. Он асинхронен, поэтому, когда он подключается к серверу, он ждет ответа. Он не знает о кодировке или чем-то еще, кроме TransferEncoding в HttpResponseMessage, который не содержит ничего, кроме "chunk" или "zip".
Итак, чтобы получить кодировку тела ответа, мы должны прочитать его переменной, а затем тщательно изучить.
Ответ 4
Вы можете получить это так:
var contentType = response.Content.Headers.GetValues("Content-Type").First());