I'm making an HTTP call. My response contains a session code X-BB-SESSION
in the header section of the HttpResponseMessage
object. How do I get that specific header value?
I am using a foreach statement to iterate through all the headers ( MSDN link ). However the compiler keeps saying that it cannot be done:
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'
This is the code I'm trying:
//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");
}
The header content from where I'm trying to get the value ( X-BB-SESSION
value) is something like:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
You should be able to use the TryGetValues
method.
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
Using Linq aswell, this is how I solved it.
string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
I think it's clean and not too long.
Though Sam's answer is correct. It can be somewhat simplified, and avoid the unneeded variable.
IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
{
session = values.FirstOrDefault();
}
Or, using a single statement with a ternary operator (as commented by @SergeySlepov):
string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null;
You are trying to enumerate one header (CacheControl) instead of all the headers, which is strange. To see all the headers, use
foreach (var value in responseHeadersCollection)
{
Debug.WriteLine("CacheControl {0}={1}", value.Name, value.Value);
}
to get one specific header, convert the Headers to a dictionary and then get then one you want
Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);
This will throw an exception if the header is not in the dictionary so you better check it using ContainsKey first
如果有人喜欢基于方法的查询,那么您可以尝试:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
Below Code Block Gives A formatted view of Response Headers
WebRequest request = WebRequest.Create(" https://-------.com "); WebResponse response = 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);
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.