2009-11-21 3 views
26

에서로드 나는 CookieContainer이 CookieJar라는 이름의 HttpWebRequest/HttpWebResponse 클래스 세션에서 추출합니다. 내 응용 프로그램은 실행 사이에 쿠키를 저장하므로 프로그램의 한 번 실행시 CookieContainer에 수집 된 쿠키는 다음 실행에도 사용됩니다.C 번호 : 디스크에 CookieContainer를 작성하고 돌아 가기 위해 사용

이 방법은 어떻게 든 CookieContainer의 내용을 디스크에 씁니다. 내 질문은 :

  • 어떻게 디스크에 CookieContainer 쓰기 수 있습니까? 이 기능이 내장되어 있습니까? 그렇지 않은 경우 사용자가 취한 접근 방식은 무엇입니까? 이 과정을 단순화 할 수있는 수업이 있습니까?
  • CookieContainer를 디스크에 쓰면 의 경우 어떻게 다시로드합니까?

UPDATE : 첫 번째 대답은 직렬화 CookieContainer 제안했다. 그러나 이러한 복잡한 객체를 직렬화하고 비 직렬화하는 방법에 대해서는 잘 알고 있지 않습니다. 샘플 코드을 제공해 주시겠습니까? 제안은 SOAPFormatter을 이용하는 것이 었습니다.

답변

19

나는 그것을 시도하지는 않았지만 Serializable 속성을 가지고 있으므로 .net 바이너리 직렬화로 [de] 직렬화 할 수있다. SoapFormatter입니다.

다음은 요청한 코드입니다. MSDN을 보면

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

는 SoapFormatter 이제 .NET 3.5에서 사용되지 않으며 당신이 경우 BinaryFormatter를 사용하는 것이 좋습니다 것 같다. 과거에는 Deserialization이 실패 할 때 진단에 도움이되는 파일이 읽기 쉽기 때문에 SoapFormatter가 유용하다는 것을 발견했습니다! 이 포맷터는 어셈블리 버전에서도 버전 변경에 민감합니다 (프레임 워크의 한 버전으로 비 직렬화하면 프레임 워크를 업그레이드하고 비 직렬화는 아니지만 확실하지 않을 수 있습니다). 문제. 나는 그들이 주로 단기간의 지속성/리모팅을 위해 디자인되었다고 생각하지만, 여기 당신을 위해 충분할 수도 있습니다.

새 DataContractSerializer가 작동하지 않는 것 같습니다.

대안으로 CookieContainerData 클래스를 작성하여 [de] serialize를 XmlSerializer로 작성하고이 CookieContainer간에 수동으로 변환 할 수 있습니다.

+0

순차 화에 대해 너무 많이 알지 못하기 때문에 몇 가지 샘플 코드를 제공 할 수 있습니까? –

+2

샘플 코드 추가 –

27

이 문제는 나이를 먹어 치웠다. 나는 그것을 해결하고 그 정보를 세계에 퍼트 렸습니다.

대답 사용하는 경우 BinaryFormatter는 : 어떻게

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

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

은 다음과 같습니다

// other includes 
using Newtonsoft.Json; 

쿠키와 클래스 :

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

어쨌든 파일 대신 SQL에 저장할 수 있습니까? – juanora

0

또 다른 대안은 사용하기 JSON 직렬화 (Json.NET)입니다 Json에게 serialize하십시오 :

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

문제는 Cookie 개체가 아닌 CookieContainer 개체를 serialize하는 것입니다. – Zax