【问题标题】:Why are my httpresponsemessage's content headers not added to the correct field?为什么我的 httpresponsemessage 的内容标头没有添加到正确的字段?
【发布时间】:2016-02-15 12:40:23
【问题描述】:

我正在尝试使用HttpClient 获取数据流,但HttpResponseMessage 发生了一些奇怪的事情,我回来了。

我发送请求的方式是这样的:

_webClient.SendAsync(new HttpRequestMessage(HttpMethod.Get, _webClient.BaseAddress + connectionSuffix), HttpCompletionOption.ResponseHeadersRead);

但是响应的 ContentHeaders 并没有像我期望的那样填充。这是一个示例:响应包含 Content-Type 标头,但在 ContentType 字段中找不到它的值,只能在通用 Headers 可数。

在 Wireshark 中分析数据包流给了我以下信息:

GET /video.cgi HTTP/1.1 授权:基本 YWRtaW46 主机:192.168.0.150 连接:保持活动状态

回答:

HTTP/1.0 200 正常 服务器:Camera Web Server/1.0 作者:史蒂文·吴 MIME 版本:1.0 缓存控制:无缓存 Content-Type: multipart/x-mixed-replace;boundary=--视频边界--

这不是世界末日,我在边界参数之后,我可以在通用 Headers 字段中找到它。但我不禁想知道:这是预期的行为吗?我似乎找不到任何关于 Getting 标头的信息,只有关于如何将它们添加到请求中(这是另一回事)

【问题讨论】:

  • 能否请您使用 fiddler2 之类的工具检查响应?
  • @OguzOzgul 我已经通过 Wireshark 检查了响应。设备发送正确的响应。我已将其包含在原始问题中。
  • 这很有趣,我认为 CompletionOption 在这里发挥了作用。为什么不在 connect.microsoft.com 上问这个问题?
  • 可能在完全接收到 http 响应标头之后立即调用此回调,同时将其填充到字典中,但在将其处理为 ContentType 或其他属性之前。有趣的是,通用列表只有内容类型,而其他标头也已收到
  • @OguzOzgul 关于其他标题。这是预期的行为。响应消息具有响应标头和内容标头。 Cache-Control、MIME-version 等是响应头,而 Content-Type 是内容头。这也让我相信,在处理之前访问字段不会出现这个问题,因为响应头被归档到正确的字段中,只是内容头没有放在相应的字段中。

标签: c# http-headers httpclient


【解决方案1】:

由于boundary的参数值中有空格,导致此标头解析失败。

这不符合 RFC2616,因为 RFC 在 Section 2 中声明标头参数值不得包含空格,否则应将它们指定为带引号的字符串。

要么改变你的边界

boundary=--videoboundary--

或到

boundary="--video boundary--"

它有效。

注意:您应该在读取后者的值时删除 qoutes。

来自 RFC,第 2 节:(LWS = 线性空白)

Many HTTP/1.1 header field values consist of words separated by LWS or 
special characters. These special characters MUST be in a quoted string
to be used within a parameter value (as defined in section 3.6).

【讨论】:

  • 感谢您的回答!我想我只需要处理它,因为我无法更改另一台设备上的软件,这是选择边界的设备。
  • 是的。保修不包括我猜的那种问题。 :) 但至少你可以向制造商报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2017-10-30
  • 1970-01-01
相关资源
最近更新 更多