我正在使用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第4.2节描述了header如何具有多个值(重点是我的):
具有相同字段名的多个消息头字段可能存在于消息中,当且仅当该标头字段的整个字段值被定义为以逗号分隔的列表,即#(值)。必须能够将多个标题字段组合成一个“字段名:字段值”对,而不需要更改消息的语义,方法是将每个后续字段值附加到第一个字段中,每个字段都用逗号分隔。因此,接收具有相同字段名的标头字段的顺序对组合字段值的解释非常重要,因此在转发消息时,代理不能更改这些字段值的顺序。
正如我们所看到的,这些值是逗号分隔的,所以我希望有一个带有7个值的枚举(0、1、1、2、3、5和8),但是TryGetValues返回一个字符串值。
我能做些什么让它返回几个值吗?
发布于 2017-09-28 13:15:37
TryGetValues返回可枚举的原因是您可以提供同名的多个标头,每个标头也可以有多个以逗号分隔的值,正如您前面提到的。即"https://httpbin.org/response-headers?X-Numbers=0,1,1,2,3,5,8&X-Numbers=6".
我同意最好将每个逗号分隔的值作为返回值中的一个值进行枚举,但当前的实现假设每个标头只能返回一个值。
发布于 2017-09-27 23:36:46
从源代码中看,缓存控制头的解析器似乎是唯一的:
缓存控制头是特殊的:它是一个支持值列表的头,但是我们将列表表示为
CacheControlHeaderValue的一个实例。也就是说,我们将SupportsMultipleValues设置为true,因为在请求/响应消息中有多个缓存控制头是可以的。但是,在解析所有缓存控制头后,只创建一个CacheControlHeaderValue实例(如果所有头包含有效值,否则可能有多个包含无效值的字符串)。
请求缓存控制总是会返回一个String,据我所知,没有任何方法(除了公关对抗多奈/协菲克斯)来欺骗它来分割它。但是,其他标头将具有不同的行为。
至于为什么以这种方式专门对待Cache-Control头,您必须询问实际的开发人员。自开源版本发布以来,该文件没有发生重大变化。
对于其他已知的标题,有一个很大的列表:KnownHeaders.cs。在那里,您应该能够深入到您感兴趣的任何特定的标题。
https://stackoverflow.com/questions/46458329
复制相似问题