14

我正在将一些代码从 using 转换HttpWebRequestHttpClient. 我遇到的一个问题是从内容类型响应标头中获取字符集。

使用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 属性始终为nullHttpResponseMessage有一个Headers属性,但它不包含内容类型标头。 HttpResponseMessage.Content还有一个 Headers 属性,它似乎包含内容类型的标题,但该标题显示"Content-Type: text/html"- 它没有字符集部分。

对相同的 url使用第一种方法HttpWebResponse,我得到了 Content-Type 标头的字符集部分。我错过了什么吗?

4

4 回答 4

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());
于 2017-08-03T13:41:00.003 回答
3

你可以这样得到它:

var contentType = response.Content.Headers.GetValues("Content-Type").First());
于 2019-07-19T03:03:25.077 回答
1

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

并感谢您帮助我找到Content-Type标题埋在HttpResponseMessage对象中的位置!

于 2014-07-05T06:38:14.567 回答
0

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

因此,要获得响应正文的编码,我们应该将其读取到变量中,然后彻底查看。

于 2016-01-27T14:57:47.400 回答