2009-11-21 20 views
26

Tôi có một CookieContainer chiết xuất từ ​​một HttpWebRequest/HttpWebResponse phiên tên CookieJar. Tôi muốn ứng dụng của tôi lưu trữ cookie giữa các lần chạy, do đó, cookie được thu thập trong CookieContainer trên một lần chạy chương trình sẽ được sử dụng lần chạy tiếp theo.C#: Viết một CookieContainer vào đĩa và tải Back In Đối với Sử dụng

Tôi nghĩ cách để làm điều này sẽ bằng cách nào đó ghi nội dung của CookieContainer vào đĩa. Câu hỏi của tôi là:

  • Làm cách nào bạn có thể viết CookieContainer vào đĩa? Có các chức năng tích hợp cho điều này hay không, nếu không, các phương pháp mà mọi người đã thực hiện là gì? Có bất kỳ lớp học nào có sẵn để đơn giản hóa điều này không?
  • Khi bạn đã viết CookieContainer vào đĩa, làm thế nào để bạn tải nó trở lại để sử dụng?

UPDATE: Câu trả lời đầu tiên đã gợi ý serialization của CookieContainer. Tuy nhiên, tôi không phải là rất quen thuộc với cách serialize và deserialize các đối tượng phức tạp như vậy. Bạn có thể cung cấp một số mã mẫu không? Đề nghị là sử dụng SOAPFormatter.

Trả lời

19

Tôi chưa thử nó nhưng nó có thuộc tính Serializable và do đó có thể được [de] tuần tự hóa với serialization nhị phân .net, ví dụ: SoapFormatter.

Đây là đoạn mã bạn đã yêu cầu.

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); 

Nhìn vào msdn có vẻ như SoapFormatter hiện không được chấp nhận trong .net 3.5 và khuyên bạn nên sử dụng Binaryformatter. Trong quá khứ tôi đã tìm thấy SoapFormatter hữu ích vì tập tin có thể đọc được, giúp chẩn đoán khi không tham chiếu được! Các trình định dạng này nhạy cảm với các thay đổi của phiên bản ngay cả trong phiên bản assembly (vì vậy nếu bạn deserialize với một phiên bản của framework nâng cấp framework, thì nó có thể không deserialize, không chắc chắn), nhưng có những cách xung quanh nó với thuộc tính Binder. vấn đề. Tôi tin rằng chúng được thiết kế chủ yếu cho sự kiên trì/trì hoãn ngắn hạn, nhưng chúng có thể đủ tốt cho bạn ở đây.

DataContractSerializer mới dường như không hoạt động với nó để thoát ra ngoài.

Một cách khác là viết một lớp CookieContainerData để [de] tuần tự hóa với XmlSerializer và chuyển đổi thủ công giữa điều này và CookieContainer.

+0

Tôi không biết quá nhiều về việc tuần tự hóa, vì vậy bạn có thể cung cấp một số mã mẫu không? –

+2

mã mẫu được thêm –

27

Vấn đề này đã làm tôi thất vọng về tuổi tác, không có gì tôi có thể tìm được. Tôi đã làm việc đó, để đưa thông tin đó ra thế giới.

trả lời bằng BinaryFormatter:

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

Có cách nào để tôi có thể lưu trữ trong SQL thay vì tệp không? – juanora

0

Một lựa chọn khác là sử dụng JSON serialization (Json.NET):

// other includes 
using Newtonsoft.Json; 

Một lớp học với một cookie:

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

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

Dưới đây là làm thế nào để tuần tự hóa nó thành Json:

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

Vấn đề là serialize đối tượng CookieContainer, không phải đối tượng Cookie. – Zax

Các vấn đề liên quan