Является ли кодировка 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());