riflessione può essere utilizzato per ottenere il campo privato che contiene tutta la chiave di dominio in oggetto CookieContainer,
D. Come ho ottenuto il nome di quel campo privato?
Ans. Utilizzando Reflector;
sua è dichiarato come:
private Hashtable m_domainTable;
una volta che otteniamo il campo privato, avremo la chiave del dominio, quindi ottenere i cookie è un semplice iterazione.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Net;
using System.Collections;
namespace ConsoleApplication4
{
static class Program
{
private static void Main()
{
CookieContainer cookies = new CookieContainer();
cookies.Add(new Cookie("name1", "value1", "/", "domain1.com"));
cookies.Add(new Cookie("name2", "value2", "/", "domain2.com"));
Hashtable table = (Hashtable) cookies.GetType().InvokeMember("m_domainTable",
BindingFlags.NonPublic |
BindingFlags.GetField |
BindingFlags.Instance,
null,
cookies,
new object[] { });
foreach (var key in table.Keys)
{
foreach (Cookie cookie in cookies.GetCookies(new Uri(string.Format("http://{0}/", key))))
{
Console.WriteLine("Name = {0} ; Value = {1} ; Domain = {2}", cookie.Name, cookie.Value,
cookie.Domain);
}
}
Console.Read();
}
}
}
fonte
2012-12-28 18:42:45
Questo metodo sembra assumere il protocollo http e i cookie creati per https non verranno visualizzati. – user1713059
@ user1713059 - dove mostra che lo sta facendo solo per HTTP? comunque, questo otterrà i cookie sia per http + https. –
C'è un 'string.Format (" http: // 'nel ciclo di stampa della console.Il metodo' GetCookies' viene chiamato usando i nomi di dominio con prefisso solo http. – user1713059