Content-Type 字符集是否未从 HttpResponseMessage 公开?

问题描述 投票:0回答:5

我正在将一些代码从使用

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"
- 它没有字符集部分。

将第一种方法与

HttpWebResponse
用于相同的 url,我得到了 Content-Type 标头的字符集部分。我错过了什么吗?

c# character-encoding httpclient content-type
5个回答
10
投票

我想在 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());

4
投票

你可以这样得到它:

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

1
投票

我相信从服务器返回的

Content-Type
标头必须包含像
'text/html;charset=UTF-8'
这样的“字符集”,以便它显示在
CharSet
属性中。在像 Fiddler (http://www.telerik.com/fiddler) 这样的工具中检查原始响应可能会有所帮助。

感谢您帮我找到

Content-Type
标头埋在
HttpResponseMessage
对象中的位置!


0
投票

HttpClient 有意不公开字符集。准确地说,它不能。它是异步的,所以当它连接到服务器时,它会等待响应。它不知道字符集或除 HttpResponseMessage 中的 TransferEncoding 之外的任何其他内容,它不包含除“chunk”或“zip”之外的任何内容。

所以要获得响应主体的编码,我们应该将其读取到一个变量,然后彻底查看。


0
投票

由于 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"));
© www.soinside.com 2019 - 2024. All rights reserved.