C #: écriture d’un cookieContainer sur un disque et ré-chargement pour utilisation

J’ai un CookieContainer extrait d’une session HttpWebRequest / HttpWebResponse appelée CookieJar . Je souhaite que mon application stocke les cookies entre les exécutions, afin que les cookies collectés dans le CookieContainer lors d’une exécution du programme soient également utilisés lors de l’exécution suivante.

Je pense que la meilleure façon de faire est d’écrire le contenu d’un CookieContainer sur le disque. Ma question est:

  • Comment pouvez-vous écrire un CookieContainer sur le disque ? Y a-t-il des fonctions intégrées pour cela, ou, sinon, quelles sont les approches adoptées par les gens? Existe-t-il des classes disponibles pour simplifier cela?
  • Une fois que vous avez écrit un CookieContainer sur le disque, comment le rechargez-vous pour l’utiliser ?

UPDATE: La première réponse a suggéré la sérialisation du CookieContainer . Cependant, je ne sais pas très bien comment sérialiser et désérialiser de tels objects complexes. Pourriez-vous fournir un exemple de code ? La suggestion était d’utiliser SOAPFormatter .

Je ne l’ai pas essayée mais elle a l’atsortingbut Serializable et peut donc être [dés] sérialisée avec une sérialisation binary .net, par exemple SoapFormatter.

Voici l’extrait de code que vous avez demandé.

 var formatter = new SoapFormatter(); ssortingng file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "cookies.dat"); using (Stream s = File.Create (file)) formatter.Serialize(s, cookies); ... CookieContainer resortingevedCookies = null; using (Stream s = File.OpenRead (file)) resortingevedCookies = (CookieContainer) formatter.Deserialize(s); 

En regardant msdn, il semble que SoapFormatter soit maintenant obsolète dans .net 3.5 et il vous recommande d’utiliser Binaryformatter. Dans le passé, j’ai trouvé SoapFormatter utile car le fichier est lisible, ce qui facilite le diagnostic en cas d’échec de la désérialisation! Ces formateurs sont sensibles aux modifications de version, même dans la version d’assemblage (donc, si vous désérialisez avec une version du framework, mettez à niveau le framework, il risque de ne pas le désérialiser, pas sûr), mais il existe des moyens de contourner ce problème avec la propriété Binder si cela devient un problème. Je crois qu’ils sont principalement conçus pour la persistance / le remoting à court terme, mais ils pourraient vous suffire.

Le nouveau DataContractSerializer ne semble pas fonctionner avec, c’est donc sorti.

Une alternative serait d’écrire une classe CookieContainerData pour [sérialiser] avec sérialiser avec XmlSerializer et convertir manuellement entre ceci et CookieContainer.

Ce problème me dérangeait depuis des lustres, rien que je puisse trouver ne fonctionne. Je me suis débrouillé pour mettre cette information au monde.

Réponse en utilisant BinaryFormatter:

  public static void WriteCookiesToDisk(ssortingng file, CookieContainer cookieJar) { using(Stream stream = File.Create(file)) { try { Console.Out.Write("Writing cookies to disk... "); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, cookieJar); Console.Out.WriteLine("Done."); } catch(Exception e) { Console.Out.WriteLine("Problem writing cookies to disk: " + e.GetType()); } } } public static CookieContainer ReadCookiesFromDisk(ssortingng file) { try { using(Stream stream = File.Open(file, FileMode.Open)) { Console.Out.Write("Reading cookies from disk... "); BinaryFormatter formatter = new BinaryFormatter(); Console.Out.WriteLine("Done."); return (CookieContainer)formatter.Deserialize(stream); } } catch(Exception e) { Console.Out.WriteLine("Problem reading cookies from disk: " + e.GetType()); return new CookieContainer(); } } 

Une autre alternative consiste à utiliser la sérialisation Json ( Json.NET ):

 // other includes using Newtonsoft.Json; 

Un cours avec un cookie:

 public class WithCookie { public Cookie MyCookie { get; set; } public WithCookie() { MyCookie = new Cookie("CF788DF", "A cookie value!", "/", ".test.com"); } } 

Voici comment le sérialiser sur Json:

 class Program { static void Main(ssortingng[] args) { try { WithCookie wc1 = new WithCookie(); // Expires a month from now wc1.MyCookie.Expires = DateTime.Now.AddMonths(1); ssortingng wc1json = JsonConvert.SerializeObject(new WithCookie()); WithCookie wc2 = JsonConvert.DeserializeObject < WithCookie>(wc1json); ssortingng wc2json = JsonConvert.SerializeObject(wc2); if (wc2json == wc1json) { Console.WriteLine("HORRAY!"); } else { // The ssortingngs will not be equal, because the Cookie.TimeStamp // changes but the cookies are in fact the same! Console.WriteLine("FAIL!"); } } catch (Exception e) { Console.WriteLine("Exception: " + e.ToSsortingng()); } Console.ReadKey(); } }