【发布时间】:2016-07-19 16:26:22
【问题描述】:
我刚刚发布了this 问题,答案马上就来了。 反过来,它会产生以下新问题:
如果我的理解是正确的,来自HttpResponseMessage 的StreamContent 对象是在通过HttpClient.GetAsync 发出HTTP 请求时创建的。它的 Header 属性或它的一部分,将根据 HTML 源文件中包含的元标记进行设置。
例如,元标记可以告诉响应对象使用哪个字符集对文件内容进行编码。
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
对包含此类行的资源运行请求将使用此设置生成HttpResponseMessage.Content.Header。
在此问题顶部引用的另一个问题中,我提到了在没有正确编码的情况下创建的响应对象。由于生成此类不兼容响应的 HTML 源确实包含负责创建正确编码的响应的设置:
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">
该站点的响应没有通过元标记中包含的字符集设置并因此以不正确的字符集呈现的原因是什么?
以下是问题的图示说明: 两个站点都包含带有字符集设置的元标记,但是一个,由于某种原因,错过了它...
两个请求的 Fiddler 标头详细信息:
工作人员: (删除 cookie 标头)
请求:
GET http://www.ynet.co.il/home/0,7340,L-8,00.html HTTP/1.1
Host: www.ynet.co.il
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Thu, 31 Mar 2016 10:04:39 GMT
回应:
HTTP/1.1 200 OK
vg_id: 1
X-me: 06
Content-Type: text/html; charset=UTF-8
Last-Modified: Thu, 31 Mar 2016 10:38:57 GMT
Accept-Ranges: bytes
VX-Cache: HIT
WAI: 01
V-TTL: 0
backend-cache-control:
Content-Length: 410685
Vary: Accept-Encoding
Date: Thu, 31 Mar 2016 10:38:48 GMT
Connection: keep-alive
有问题的一:
请求:
GET http://winedepot.co.il/ HTTP/1.1
Host: winedepot.co.il
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: __utma=201832727.725995063.1458660502.1459413977.1459418530.8; __utmz=201832727.1458660502.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); __utmc=201832727; ASPSESSIONIDCQTRQCAQ=FEOHEBFCBGABBKOBAHOGKBGB
Connection: keep-alive
回应:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 118225
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Thu, 31 Mar 2016 10:36:21 GMT
【问题讨论】:
-
我很确定
HttpResponseMessage类确实 not 解析响应 HTML 以读取任何元标记。不过我可能是错的。您是否非常确定您看到的行为源于这些标签,如果是,您是如何验证的? -
这是一个假设,但基于分析上述摘录的结果。
-
是的,但是您没有显示整个 HTTP 响应,因此我们无法验证字符集实际上不是来自响应标头。
-
您认为哪个请求标头可以影响这里?不要忘记 Content-Type 只是一个响应头。我会将它添加到屏幕截图中,但我没有看到任何相关的内容。
-
我不是在谈论任何地方的请求标头。不要添加屏幕截图,将其添加为文本。使用 Fiddler 获取请求和响应标头。此外,content-type 可以用作请求头。
标签: c# dotnet-httpclient httpcontent httpresponsemessage