【问题标题】:HttpClient request to local IIS 8.0 does not produce expected headers in the response对本地 IIS 8.0 的 HttpClient 请求不会在响应中产生预期的标头
【发布时间】:2013-05-30 05:10:43
【问题描述】:

我正在向在 IIS 中运行的本地网站发出以下请求

var httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.RequestUri = new Uri("http://localhost:8081/");
httpRequestMessage.Method = HttpMethod.Get;

var response = new HttpClient().SendAsync(httpRequestMessage).Result;

这会产生以下响应标头:

HTTP/1.1 200 正常
接受范围:字节
日期:格林威治标准时间 2013 年 6 月 3 日星期一 22:34:25
ETag:“50c7472eb342ce1:0”
服务器:Microsoft-IIS/8.0
X-Powered-By:ASP.NET

通过 Fiddler 发出的相同请求会产生以下响应标头(我已经突出显示了差异):

HTTP/1.1 200 OK
内容类型:text/html
最后修改时间:2013 年 4 月 26 日星期五 19:20:58 GMT
接受范围:字节
ETag:“50c7472eb342ce1:0”
服务器:Microsoft-IIS/8.0
X-Powered-By:ASP.NET
日期:2013 年 6 月 3 日星期一 22:29:34 GMT
内容长度:10

为什么响应标头有所不同?
我是否正确使用了 HttpClient(除了我同步调用 Send 的事实)?

【问题讨论】:

  • 您是否验证过请求实际上是相同的?你也可以在这里发布这两个请求吗?

标签: http http-headers .net-4.5 iis-8


【解决方案1】:

TL;DR;

要访问所有响应标头,您需要阅读HttpResponseMessage.HeadersHttpResponseMessage.Content.Headers 属性。

长答案:

这基本上是:

var response = new HttpClient().GetAsync("http://uri/").Result;
var allHeaders = response.Headers.Union(response.Content.Headers);

foreach (var header in allHeaders)
{
    // do stuff
}

我发现这有两个问题:

  • Headers 属性的名称不恰当:它实际上应该是 SomeHeadersAllHeadersExceptContentHeaders。 (我的意思是,真的,当你看到一个名为 Headers 的属性时,你希望它返回 all 标头还是 some 标头?我很确定它们违反了他们自己的框架设计指南。)
  • MSDN page 从未提及这是所有标头的子集,开发人员还应检查Content.Headers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 2018-01-26
    • 2014-04-19
    • 1970-01-01
    • 2017-02-08
    • 2016-05-06
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多