.net - ejemplo - Cómo hacer un ciclo a través de WebHeaderCollection
webrequest create (10)
En Silverlight.
Si quieres las claves y valores uno por uno:
foreach (string key in webHeaderCollection)
{
var value = webHeaderCollection[key];
// do something with key and value
}
Si quieres un diccionario de claves y valores:
var dic = webHeaderCollection.AllKeys.ToDictionary(k => webHeaderCollection[k]);
foreach (var pair in MyDic)
{
// do something with pair.Key and pair.Value
}
¿Cómo recorres un WebHeaderCollection obtenido de HttpWebResponse en Windows Phone 7 para obtener claves y valores? Hemos intentado Enumerator.Current; Con esto, solo obtenemos las claves, no los valores. Estamos haciendo esto para obtener una URL redirigida.
¿Qué tal un poco de C # 6 :)
string.Join("&", headers.AllKeys.Select(key => $"{key}={headers[key]}").ToList());
Descubrí esta pregunta de Google mientras intentaba encontrar una manera de ver los pares clave-valor en una colección WebHeader del depurador de Visual Studio.
Solución simple (en retrospectiva): el método WebHeaderCollection.ToString (), utilizado en la ventana de depuración de Watch, logrará esto:
webheadercollection.ToString()
Por lo tanto, si tiene una solicitud con nombre HttpWebRequest:
request.Headers.ToString()
En WP7 / Silverlight hago esto.
foreach (string key in headers.AllKeys)
{
Console.WriteLine("Header : " + key + " ---> " + headers[key]);
}
Esa es una colección horrible, creo.
Ver ejemplo de MSDN . Prefiero este:
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);
}
}
Desafortunadamente, no hay forma de obtener valores con el orden de conservación entre otros encabezados.
Estilo PS Linq (en LINQPad )
var items = Enumerable
.Range(0, headers.Count)
.SelectMany(i => headers.GetValues(i)
.Select(v => Tuple.Create(headers.GetKey(i), v))
);
items.Dump();
Mi solución, como método de extensión:
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();
}
Realmente no me gusta cuando en ocasiones existen colecciones especiales como esta en .NET que no se repiten fácilmente para los valores esperados. Hace las cosas mucho menos fáciles de usar. De todos modos, si te apetece tomarte la molestia de agregar un método de extensión:
// 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;
}
}
Si realmente desea utilizar el método de extensión para obtener una lista de encabezados como matriz KeyValuePair, es posible que desee utilizar la interfaz 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]]);
}
}
}
En este caso puedes iterar de manera fácil el bucle foreach:
foreach (var x in h.GetHeaders())
{
Console.WriteLine(x.Key + ": " + x.Value);
}
For i As Integer = 0 To Response.Headers.Count - 1
''Response.Headers.Get(i)
Next
foreach(string key in resp.AllKeys)
{
string value = resp[key];
}