【问题标题】:Why does the IEnumerable returned by HttpRequestHeaders.GetValues(string) only ever have 1 string?为什么 HttpRequestHeaders.GetValues(string) 返回的 IEnumerable 只有 1 个字符串?
【发布时间】:2014-10-23 13:44:37
【问题描述】:

我不明白为什么 HttpRequestHeaders.GetValues(string) 返回的 IEnumerable 返回一个只有 1 个项目的 IEnumerable。

当标题中有多个具有所请求名称的项目时,我会得到一个带有 1 个字符串条目的 IEnumerable,它等于所有匹配的标题项目的 CSV 连接。

如果返回值是一个 IEnumerable,我希望每个匹配的标头条目都是它自己的项目。相反,如果该方法总是连接所有内容,那么我希望返回值只是一个字符串。

预期:

{ "Test", "Test2" }

实际:

{ "Test, Test2" }

使用 Fiddler 进行测试,我尝试在标题中添加多个条目:

GET https://localhost/api/v1/users/1 HTTP/1.1
Host: localhost
TestHeaderField: Test
TestHeaderField: Test2

以及多个逗号分隔的项目:

GET https://localhost/api/v1/users/1 HTTP/1.1
Host: localhost
TestHeaderField: Test, Test2

我正在使用 ASP.NET Web API 2 5.0.0 版和 .Net 4.5.1。是我在这里遗漏了什么还是底层代码中的错误?

【问题讨论】:

  • 仅仅是因为这是 RFC 2616 的要求。明确地来自 HTTP 1.1 §4.2:“当且仅当该标头字段的整个字段值被定义为逗号分隔列表时,具有相同字段名称的多个消息头字段可能出现在消息中” 。 HttpRequestHeaders 包含已解析的标头,解析器执行一些“清理”。
  • @AdrianoRepetti 但是第二个例子一个逗号分隔的值列表,GetValues 返回一个IEnumerable,那么为什么不存在多个值呢?为什么它不只返回一个string
  • @RGraham 因为第二个示例不需要任何清理。逗号分隔的列表...是单个字符串。我想知道何时可能返回多个值...

标签: c# http-headers asp.net-web-api2


【解决方案1】:

HttpRequestHeaders.GetValues 将为它具有解析器的标头返回多个值,如果这些值格式正确的话。您可以通过发送多个Accept 标头来测试这一点:

GET https://localhost/api/v1/users/1 HTTP/1.1
Host: localhost
Accept: text/html
Accept: application/xhtml+xml
Accept: application/xml

【讨论】:

    【解决方案2】:

    您可以尝试这样的方法来获取每个请求标头:

    NameValueCollection headers = HttpRequestHeaders;
    for (int i = 0; i < headers.Count; i++)
    {
        string key = headers.GetKey(i);
        string value = headers.Get(i);
        // use key and value
    }
    

    根据需要进行调整,您似乎只有值而没有键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2016-04-19
      • 2017-09-01
      • 1970-01-01
      相关资源
      最近更新 更多