with services net mvc example crear asp c# .net cookiecontainer

c# - services - mvc login controller



¿Cómo puedo obtener todas las cookies de un CookieContainer? (4)

Este método asegurará obtener todas las cookies, sin importar cuál sea el protocolo:

public static IEnumerable<Cookie> GetAllCookies(this CookieContainer c) { Hashtable k = (Hashtable)c.GetType().GetField("m_domainTable", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(c); foreach (DictionaryEntry element in k) { SortedList l = (SortedList)element.Value.GetType().GetField("m_list", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(element.Value); foreach (var e in l) { var cl = (CookieCollection)((DictionaryEntry)e).Value; foreach (Cookie fc in cl) { yield return fc; } } } }

Quiero exportar un CookieContainer a JSON usando Newtonsoft.Json, pero desafortunadamente, CookieContainer no tiene un enumerador o algo así, así que no puedo recorrerlo ...

Edit: Con mi solución publicada sería algo como esto:

private static void Main(string[] args) { CookieContainer cookieContainer = new CookieContainer(); cookieContainer.Add(new Cookie("name1", "value1", "/", ".testdomain1.com")); cookieContainer.Add(new Cookie("name2", "value1", "/path1/", ".testdomain1.com")); cookieContainer.Add(new Cookie("name2", "value1", "/path1/path2/", ".testdomain1.com")); cookieContainer.Add(new Cookie("name1", "value1", "/", ".testdomain2.com")); cookieContainer.Add(new Cookie("name2", "value1", "/path1/", ".testdomain2.com")); cookieContainer.Add(new Cookie("name2", "value1", "/path1/path2/", ".testdomain2.com")); CookieCollection cookies = GetAllCookies(cookieContainer); Console.WriteLine(JsonConvert.SerializeObject(cookies, Formatting.Indented)); Console.Read(); }


La primera respuesta no funcionó para un proyecto portátil. Así que aquí está la opción 2, también usa la reflexión.

using System.Linq; using System.Collections; using System.Reflection; using System.Net; public static CookieCollection GetAllCookies(this CookieContainer container) { var allCookies = new CookieCollection(); var domainTableField = container.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name == "m_domainTable"); var domains = (IDictionary)domainTableField.GetValue(container); foreach (var val in domains.Values) { var type = val.GetType().GetRuntimeFields().First(x => x.Name == "m_list"); var values = (IDictionary)type.GetValue(val); foreach (CookieCollection cookies in values.Values) { allCookies.Add(cookies); } } return allCookies; }

1) También lo intenté

var domainTableField = container.GetType().GetRuntimeField("m_domainTable");

pero volvió nulo.

2) Puede iterar a través de dominios. Claves y usar container.GetCookies () para todas las claves. Pero he tenido problemas con eso, porque GetCookies espera que Uri y no todas mis claves coincidan con el patrón de Uri.


Una solución utilizando la reflexión:

public static CookieCollection GetAllCookies(CookieContainer cookieJar) { CookieCollection cookieCollection = new CookieCollection(); Hashtable table = (Hashtable) cookieJar.GetType().InvokeMember("m_domainTable", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance, null, cookieJar, new object[] {}); foreach (var tableKey in table.Keys) { String str_tableKey = (string) tableKey; if (str_tableKey[0] == ''.'') { str_tableKey = str_tableKey.Substring(1); } SortedList list = (SortedList) table[tableKey].GetType().InvokeMember("m_list", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance, null, table[tableKey], new object[] { }); foreach (var listKey in list.Keys) { String url = "https://" + str_tableKey + (string) listKey; cookieCollection.Add(cookieJar.GetCookies(new Uri(url))); } } return cookieCollection; }


Utilice el método CookieContainer.GetCookies

CookieCollection cookies = cookieContainer.GetCookies(new Uri(url));

donde url es la URL de su sitio.

En mi caso, no pude usar la reflexión, como se sugiere en otras respuestas. Sin embargo, sí sabía la URL de mi sitio para consultar. Creo que incluso es lógico que el contenedor no devuelva todas las cookies a ciegas, sino que las devuelva por URL porque las cookies siempre pertenecen a una URL en particular y no se pueden usar fuera del contexto del dominio asociado a ellas.