2009-11-21 8 views
26

में लोड हो रहा है मैं एक CookieContainerCookieJar नाम के एक HttpWebRequest/HttpWebResponse सत्र से निकाली गई है। मैं चाहता हूं कि मेरा एप्लिकेशन रनों के बीच कुकीज़ स्टोर करे, इसलिए प्रोग्राम के एक रन पर CookieContainer में एकत्र की गई कुकी का भी अगली रन का उपयोग किया जाएगा।सी #: डिस्क के लिए एक CookieContainer लेखन और वापस लिए उपयोग

मुझे लगता है कि ऐसा करने का तरीका डिस्क पर कुकी कुकीर की सामग्री को किसी भी तरह लिखना होगा। मेरा प्रश्न है:

  • आप डिस्क करने के लिए एक CookieContainer कैसे लिख कर सकते हैं? क्या इसके लिए अंतर्निहित कार्य हैं, या यदि नहीं, तो लोगों ने क्या दृष्टिकोण लिया है? क्या इसे सरल बनाने के लिए कोई कक्षा उपलब्ध है?
  • एक बार जब आप डिस्क पर कुकी कंटनर लिख चुके हैं, उपयोग के लिए आप इसे वापस कैसे लोड करते हैं?

अद्यतन: पहले उत्तर क्रमबद्धता CookieContainer की सुझाव दिया है। हालांकि, मैं इस तरह की जटिल वस्तुओं को क्रमबद्ध और deserialize करने के बारे में बहुत परिचित नहीं हूँ। क्या आप कुछ नमूना कोड प्रदान कर सकते हैं? सुझाव SOAPFormatter का उपयोग करना था।

उत्तर

19

मैंने कोशिश नहीं की है लेकिन इसमें विशेषता सीरियलज़ेबल है और इसलिए [डी] .net बाइनरी क्रमबद्धता के साथ क्रमबद्ध किया जा सकता है, उदाहरण के लिए। SoapFormatter।

यहां कोड स्निपेट है जिसके लिए आपने पूछा था।

var formatter = new SoapFormatter(); 
string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "cookies.dat"); 

using (Stream s = File.Create (file)) 
    formatter.Serialize(s, cookies);        
... 
CookieContainer retrievedCookies = null; 
using (Stream s = File.OpenRead (file)) 
    retrievedCookies = (CookieContainer) formatter.Deserialize(s); 

MSDN को देखते हुए यह SoapFormatter अब .net 3.5 में पदावनत किया गया है और यह आपको BinaryFormatter का उपयोग की सिफारिश की है। अतीत में मैंने सोपफॉर्मेटर को उपयोगी पाया है क्योंकि फ़ाइल पठनीय है जो deserialization विफल होने पर निदान के साथ मदद करता है! ये स्वरूपक असेंबली संस्करण में भी संस्करण परिवर्तनों के प्रति संवेदनशील हैं (इसलिए यदि आप ढांचे के एक संस्करण के साथ ढांचे को अपग्रेड करते हैं, तो यह निश्चित रूप से निराशाजनक नहीं हो सकता है), लेकिन बाइंडर संपत्ति के साथ इसके आसपास के तरीके हैं यदि यह हो जाता है एक समस्या। मेरा मानना ​​है कि वे मुख्य रूप से अल्पकालिक दृढ़ता/रिमोटिंग के लिए डिज़ाइन किए गए हैं, लेकिन वे यहां आपके लिए पर्याप्त हो सकते हैं।

नया डेटाकंट्रैक्टसेरियलाइज़र इसके साथ काम नहीं कर रहा है, इसलिए यह बाहर है।

एक वैकल्पिक कुकीजकंटरडेटा वर्ग को [डी] XmlSerializer के साथ क्रमबद्ध करने और मैन्युअल रूप से इस और कुकी कोंटेनर के बीच कनवर्ट करने के लिए लिखना होगा।

+0

मुझे क्रमबद्धरण के बारे में बहुत कुछ पता नहीं है, तो क्या आप कुछ नमूना कोड प्रदान कर सकते हैं? –

+2

नमूना कोड जोड़ा गया –

27

यह समस्या मुझे उम्र के लिए परेशान कर रही थी, मुझे कुछ भी नहीं मिला। मैंने इसे काम किया, इसलिए उस जानकारी को दुनिया में डाल दिया।

उत्तर BinaryFormatter का उपयोग कर:

// other includes 
using Newtonsoft.Json; 

एक कुकी के साथ एक वर्ग:

public class WithCookie 
{ 
    public Cookie MyCookie { get; set; } 

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

यहाँ है कैसे करने के लिए

public static void WriteCookiesToDisk(string 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(string 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(); 
     } 
    } 
+0

वैसे भी है कि मैं एक फ़ाइल के बजाय एसक्यूएल में स्टोर कर सकते हैं? – juanora

0

एक अन्य विकल्प Json क्रमबद्धता (Json.NET) का उपयोग करने के लिए है इसे जेसन को क्रमबद्ध करें:

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      WithCookie wc1 = new WithCookie(); 
      // Expires a month from now 
      wc1.MyCookie.Expires = DateTime.Now.AddMonths(1); 

      string wc1json = JsonConvert.SerializeObject(new WithCookie()); 

      WithCookie wc2 = JsonConvert.DeserializeObject < WithCookie>(wc1json); 

      string wc2json = JsonConvert.SerializeObject(wc2); 

      if (wc2json == wc1json) 
      { 
       Console.WriteLine("HORRAY!"); 
      } 
      else 
      { 
       // The strings 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.ToString()); 
     } 
     Console.ReadKey(); 
    } 
} 
+4

समस्या कुकी ऑब्जेक्ट नहीं, कुकी कंटेंटर ऑब्जेक्ट को क्रमबद्ध करती है। – Zax