Как перебрать WebHeaderCollection - PullRequest
26 голосов
/ 22 июня 2011

Как вы перебираете WebHeaderCollection, полученный из HttpWebResponse в Windows Phone 7, чтобы получить ключи и значения?Мы пробовали Enumerator.Current;при этом мы получаем только ключи, а не значения.Мы делаем это, чтобы получить перенаправленный URL.

Ответы [ 10 ]

31 голосов
/ 05 сентября 2012

Думаю, это ужасная коллекция.

См. Пример MSDN .Я бы предпочел этот:

var headers = new System.Net.WebHeaderCollection();
headers.Add("xxx", "yyy");
headers.Add("zzz", "fff");
headers.Add("xxx", "ttt");
for(int i = 0; i < headers.Count; ++i)
{
    string header = headers.GetKey(i);
    foreach(string value in headers.GetValues(i))
    {
        Console.WriteLine("{0}: {1}", header, value);
    }
}

К сожалению, нет способа получить значения с сохранением порядка между другими заголовками.

Стиль PS Linq (в LINQPad )

var items = Enumerable
                .Range(0, headers.Count)
                .SelectMany(i => headers.GetValues(i)
                    .Select(v => Tuple.Create(headers.GetKey(i), v))
                );
items.Dump();
14 голосов
/ 28 октября 2011
foreach(string key in resp.AllKeys)
{
string value = resp[key];
}
10 голосов
/ 18 декабря 2012

в WP7 / Silverlight Я делаю это.

foreach (string key in headers.AllKeys)
{
   Console.WriteLine("Header : " + key + " ---> " + headers[key]);
}
3 голосов
/ 24 января 2017

Как насчет C # 6:)

string.Join("&", headers.AllKeys.Select(key => $"{key}={headers[key]}").ToList());
2 голосов
/ 10 июля 2014

в Silverlight.

Если вы хотите, чтобы ключи и значения по одному:

foreach (string key in webHeaderCollection)
{
    var value = webHeaderCollection[key];
    // do something with key and value
}

Если вам нужен словарь ключей и значений:

var dic = webHeaderCollection.AllKeys.ToDictionary(k => webHeaderCollection[k]);
foreach (var pair in MyDic)
{
    // do something with pair.Key and pair.Value
}
2 голосов
/ 03 июля 2012

Мне действительно не нравится, когда в .NET иногда существуют подобные коллекции, которые нелегко повторять для получения ожидаемых значений.Делает вещи намного менее удобными для пользователя.В любом случае, если вы хотите добавить метод расширения:

// call in your main code
KeyValuePair<string, string>[] headers = webResponse.Headers.GetHeaders();

// extension: 
public static class Xtension
{
    public static KeyValuePair<string, string>[] GetHeaders(this WebHeaderCollection webHeaderCollection)
    {
        string[] keys = webHeaderCollection.AllKeys;
        var keyVals = new KeyValuePair<string, string>[keys.Length];
        for (int i = 0; i < keys.Length; i++)
            keyVals[i] = new KeyValuePair<string, string>(keys[i], webHeaderCollection[keys[i]]);
        return keyVals;
    }
}
1 голос
/ 30 июня 2015

Мое решение, как метод расширения:

private static string Serialize(this System.Net.WebHeaderCollection value)
{
    var response = new System.Text.StringBuilder();
    foreach (string k in value.Keys)
        response.AppendLine(k + ": " + value[k]);
    return response.ToString();
}
1 голос
/ 11 марта 2015

Я получил этот вопрос от Google, когда пытался найти способ просмотра пар ключ-значение в WebHeaderCollection из отладчика Visual Studio.

Простое решение (в ретроспективе): WebHeaderCollection.Метод ToString (), используемый в окне отладки Watch, выполнит это:

webheadercollection.ToString()

Итак, если у вас есть HttpWebRequest с именем request:

request.Headers.ToString()
0 голосов
/ 18 февраля 2018

Если вы действительно хотите использовать метод расширения для получения списка заголовков в виде массива KeyValuePair, вы можете использовать интерфейс IEnumerable.

public static class WebHeaderCollectionExtensions
{
    public static IEnumerable<KeyValuePair<string, string>> GetHeaders(this System.Net.WebHeaderCollection webHeaderCollection)
    {
        string[] keys = webHeaderCollection.AllKeys;
        for (int i = 0; i < keys.Length; i++)
        {
            yield return new KeyValuePair<string, string>(keys[i], webHeaderCollection[keys[i]]);
        }
    }
}

В этом случае вы можете выполнять итерацию в цикле foreach простым способом:

foreach (var x in h.GetHeaders())
{
    Console.WriteLine(x.Key + ": " + x.Value);
}
0 голосов
/ 10 августа 2011
For i As Integer = 0 To Response.Headers.Count - 1
   'Response.Headers.Get(i)
Next
...