.net - WebHeaderCollection をループする方法




windows-mobile httpwebresponse (7)

Silverlightで。

キーと値を1つずつ必要とする場合:

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
}

どのようにWebHeaderCollectionを介してWindowsの電話7でHttpWebResponseからキーと値を取得するループですか? Enumerator.Currentを試しました。 これで、値を取得するのではなく、キーを取得するだけです。 リダイレクトされたURLを取得するためにこれを行っています。


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);
}

このような特別なコレクションが期待値のために簡単に繰り返されない.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;
    }
}

それはひどいコレクションだと思います。

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();

私の解決策は、拡張メソッドとして:

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();
}

私は、Visual StudioデバッガからWebHeaderCollectionでキーと値のペアを表示する方法を見つけようとしていましたが、Googleからこの質問に上陸しました。

シンプルなソリューション(振り返り):Watchデバッグウィンドウで使用されるWebHeaderCollection.ToString()メソッドは、これを実現します:

webheadercollection.ToString()

したがって、HttpWebRequestという名前のrequestがある場合は、

request.Headers.ToString()

foreach(string key in resp.AllKeys)
{
string value = resp[key];
}




httpwebresponse