我正在进行HTTP调用。我的回复在X-BB-SESSION
对象的标题部分中包含会话代码HttpResponseMessage
。如何获取特定的标头值?
我使用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
答案 0 :(得分:60)
您应该可以使用TryGetValues
方法。
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
答案 1 :(得分:3)
您正在尝试枚举一个标头(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进行检查
答案 2 :(得分:3)
虽然Sam的回答是正确的。它可以稍微简化,并避免不必要的变量。
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;
答案 3 :(得分:3)
也使用Linq,这就是我解决的方法。
string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
我认为这很干净,而且时间不太长。
答案 4 :(得分:2)
如果有人喜欢基于方法的查询,则可以尝试:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
答案 5 :(得分:0)
下面的代码块给出了响应头的格式化视图
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);
}
答案 6 :(得分:0)
您现在可以通过以下方式更轻松地完成此操作
var session = response.GetHeaderValue("X-BB-SESSION");
如果标头不存在,则方法返回null
。