Ответ 1
Вы можете использовать метод TryGetValues
.
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
Я делаю HTTP-вызов. Мой ответ содержит код сеанса X-BB-SESSION
в разделе заголовка объекта HttpResponseMessage
. Как получить конкретное значение заголовка?
Я использую оператор foreach для перебора всех заголовков (ссылка MSDN). Однако компилятор продолжает говорить, что это невозможно сделать:
foreach statement cannot operate on variables of type
System.net.http.headers.cachecontrolheadervalue because
'System.net.http.headers.cachecontrolheadervalue' does not 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
Вы можете использовать метод TryGetValues
.
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
Хотя Сэм ответ правильный. Это можно несколько упростить и избежать ненужной переменной.
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;
Используя Linq, я так решил.
string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
Я думаю, что это чисто и не слишком долго.
Вы пытаетесь перечислить один заголовок (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 first
Если кому-то нравятся запросы на основе методов, вы можете попробовать:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
Ниже блок кода дает форматированное представление заголовков ответа
Запрос WebRequest = 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);
}