如何从 HttpResponseMessage 中获取特定的标头值
Posted
技术标签:
【中文标题】如何从 HttpResponseMessage 中获取特定的标头值【英文标题】:How to get an specific header value from the HttpResponseMessage 【发布时间】:2014-08-22 04:12:21 【问题描述】:我正在进行 HTTP 调用。我的响应在HttpResponseMessage
对象的标题部分中包含会话代码X-BB-SESSION
。如何获取特定的标头值?
我正在使用 foreach 语句遍历所有标题 (MSDN link)。但是编译器一直说它无法完成:
foreach statement cannot operate on variables of type
System.net.http.headers.cachecontrolheadervalue because
'System.net.http.headers.cachecontrolheadervalue' doesn't contain
a public definition for 'GetEnumerator'
这是我正在尝试的代码:
//Connection code to BaasBox
HttpResponseMessage response = await client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead);
if (response.IsSuccessStatusCode)
//get the headers
HttpResponseHeaders responseHeadersCollection = response.Headers;
foreach (var value in responseHeadersCollection.CacheControl) --> HERE
string sTemp = String.Format("CacheControl 0=1", value.Name, value.Value);
else
Console.WriteLine("X-BB-SESSION: NOT Found");
我试图从中获取值的标题内容(X-BB-SESSION
值)类似于:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
【问题讨论】:
你不是说windows phone 8.1吗? 可能是 WP 8 或 WP 8.1 当我开始做测试时,它是在 WP8 中。现在有了自动更新,我有 WP 8.1 但是,相同的代码在此之前一直在工作(以获得特定的标题) 【参考方案1】:您应该可以使用TryGetValues
方法。
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
string session = values.First();
【讨论】:
注意:First() 是扩展方法;包括 System.Linq 以访问它。 而不是IEnumberable<string>
,我需要使用Microsoft.Extensions.Primitives.StringValues
【参考方案2】:
也使用 Linq,这就是我解决它的方法。
string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
我认为它很干净而且不会太长。
【讨论】:
请注意,如果找不到标头,这将引发异常。如果这是你想要的,你也可以使用 First() 而不是 FirstOrDefault()。【参考方案3】:虽然山姆的回答是正确的。可以稍微简化一下,避免不必要的变量。
IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
session = values.FirstOrDefault();
或者,使用带有三元运算符的单个语句(由@SergeySlepov 评论):
string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null;
【讨论】:
如果你走那条路,那么你可以再删除 1 个变量:response.Headers.TryGetValues("X-BB-SESSION", out var values)
@GuillaumePerrot 你是对的。但是这是在 c# 7 中添加的,所以我使用“旧”方式来兼容。
一路走,使用:string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null;
对我来说完美无缺【参考方案4】:
如果有人喜欢基于方法的查询,那么你可以试试:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
【讨论】:
【参考方案5】:您试图枚举一个标头 (CacheControl) 而不是所有标头,这很奇怪。要查看所有标题,请使用
foreach (var value in responseHeadersCollection)
Debug.WriteLine("CacheControl 0=1", value.Name, value.Value);
要获取一个特定的标题,请将标题转换为字典,然后获取您想要的一个
Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);
如果标题不在字典中,这将引发异常,因此您最好先使用 ContainsKey 进行检查
【讨论】:
嗨,伊戈尔。我也测试了你的代码,它可以工作。我只是想出了另一个获得相同价值的替代方案。谢谢! 可能类似于 Debug.WriteLine(response.Headers.FirstOrDefault(k=>k.Key == "X-BB-SESSION")?.Value.FirstOrDefault()); "...将标题转换为字典..." 请参阅 dotnetcodr.com/2014/03/13/…【参考方案6】:下面的代码块给出了响应标头的格式化视图
WebRequest 请求 = WebRequest.Create("https://-------.com"); WebResponse 响应 = request.GetResponse();
foreach (var headerItem in response.Headers)
IEnumerable<string> values;
string HeaderItemValue="";
values = response.Headers.GetValues(headerItem.ToString());
foreach (var valueItem in values)
HeaderItemValue = HeaderItemValue + valueItem + ";";
Console.WriteLine(headerItem + " : " + HeaderItemValue);
【讨论】:
以上是关于如何从 HttpResponseMessage 中获取特定的标头值的主要内容,如果未能解决你的问题,请参考以下文章
如何从HttpResponseMessage获取特定的标头值
如何从 javascript 中的 C# HttpResponseMessage 读取内容?
在内容 100% 完成之前从 HttpResponseMessage 读取标头