我正在使用HttpHeaders.TryGetValues,但我无法弄清楚如何让它返回几个值。
以下是我正在尝试的内容:
using System.Net.Http;
var response = await new HttpClient().GetAsync("https://httpbin.org/response-headers?X-Numbers=0,1,1,2,3,5,8");
var success = response.Headers.TryGetValues("X-Numbers", out var values);
Console.WriteLine($"{success} ({values.Count()}) -> '{values.First()}'");
结果如下:
True (1) -> '0,1,1,2,3,5,8'
像往常一样,文档非常稀疏,所有关于values
参数的说法都是
指定的标头值。
RFC 2616 section 4.2描述了HTTP标头如何具有多个值(强调我的):
具有相同字段名称的多个消息标题字段可能会出现在消息中,当且仅当该标题字段的整个字段值定义为以逗号分隔时列表 [即#(值)]。必须可以将多个标题字段组合成一个"字段名称:字段值"通过将每个后续字段值附加到第一个字段值,每个字节值用逗号分隔,而不改变消息的语义。因此,接收具有相同字段名称的头字段的顺序对于组合字段值的解释是重要的,因此代理不得在转发消息时改变这些字段值的顺序。
正如我们所看到的,这些值是以逗号分隔的,所以我希望有7个vaules(0
,1
,1
,2
,{ {1}},3
和5
),而是8
返回单个字符串值。
我能做些什么让它返回几个值?
答案 0 :(得分:1)
TryGetValues返回可枚举的原因是您可以提供多个具有相同名称的标头,每个标头也可以使用逗号分隔多个值,如您所述。即"https://httpbin.org/response-headers?X-Numbers=0,1,1,2,3,5,8&X-Numbers=6"
。
我同意将每个逗号分隔值作为可枚举的返回值中的单个值更好,但是当前实现假设每个标头只能返回一个值。
答案 1 :(得分:0)
从source code开始,Cache-Control标头的解析器看起来很独特:
Cache-Control标头是特殊的:它是支持值列表的标头,但我们代表列表 作为
CacheControlHeaderValue
的一个实例。我们将SupportsMultipleValues
设置为true
,因为它是 确定在请求/响应消息中有多个Cache-Control标头。然而,在解析所有之后 Cache-Control标头,只创建CacheControlHeaderValue
的一个实例(如果所有标头都包含有效 值,否则我们可能有多个包含无效值的字符串。)
要求Cache-Control将始终返回单个String
,据我所知,没有办法(没有PR对donet/corefx)来欺骗它把它分开给你。但是,其他标头会有不同的行为。
至于为什么以这种方式特别处理Cache-Control标头,您必须询问实际的开发人员。自开源发布以来,该文件没有发生重大变化。
对于其他已知标题,有一个很大的列表:KnownHeaders.cs。从那里你应该能够深入了解你感兴趣的任何特定标题。