我正在将一些代码从使用
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 标头的字符集部分。我错过了什么吗?
我想在 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());
你可以这样得到它:
var contentType = response.Content.Headers.GetValues("Content-Type").First();
我相信从服务器返回的
Content-Type
标头必须包含像 'text/html;charset=UTF-8'
这样的“字符集”,以便它显示在 CharSet
属性中。在像 Fiddler (http://www.telerik.com/fiddler) 这样的工具中检查原始响应可能会有所帮助。
感谢您帮我找到
Content-Type
标头埋在HttpResponseMessage
对象中的位置!
HttpClient 有意不公开字符集。准确地说,它不能。它是异步的,所以当它连接到服务器时,它会等待响应。它不知道字符集或除 HttpResponseMessage 中的 TransferEncoding 之外的任何其他内容,它不包含除“chunk”或“zip”之外的任何内容。
所以要获得响应主体的编码,我们应该将其读取到一个变量,然后彻底查看。
由于 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"));