33

CookieJarCookieContainerという名前の HttpWebRequest/HttpWebResponse セッションから抽出しました。アプリケーションが実行間で Cookie を保存するようにしたいので、プログラムの 1 回の実行で収集された Cookie が次の実行でも使用されます。CookieContainer

これを行う方法は、どうにかして CookieContainer の内容をディスクに書き込むことだと思います。私の質問は:

  • どうすればCookieContainer をディスクに書き込むことができますか? このための組み込み関数はありますか? または、そうでない場合、人々が取ったアプローチは何ですか? これを簡素化するために利用できるクラスはありますか?
  • CookieContainer をディスクに書き込んだ後、使用するためにどのようにロードし直しますか?

更新:最初の回答は、のシリアル化CookieContainerを示唆しています。しかし、私はそのような複雑なオブジェクトをシリアライズおよびデシリアライズする方法にあまり詳しくありません。サンプルコードを教えてください。提案は、利用することでしたSOAPFormatter

4

3 に答える 3

39

この問題は何年もの間私を悩ませていました。私はそれを解決したので、その情報を世に出しました。

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(); 
        }
    }
于 2012-01-15T06:22:26.667 に答える
22

試したことはありませんが、Serializable という属性があるため、SoapFormatter などの .net バイナリ シリアライゼーションで [デ] シリアライズできます。

これがあなたが求めたコードスニペットです。

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 を使用することをお勧めします。過去に、逆シリアル化が失敗した場合の診断に役立つファイルが読み取り可能であるため、SoapFormatter が役立つことがわかりました。これらのフォーマッターは、アセンブリ バージョンであってもバージョンの変更に敏感です (フレームワークをアップグレードするフレームワークの 1 つのバージョンで逆シリアル化すると、逆シリアル化されない可能性があります)。問題。これらは主に短期間の永続化/リモート処理用に設計されていると思いますが、ここでは十分に機能する可能性があります.

新しい DataContractSerializer はそれで動作しないようです。

別の方法として、CookieContainerData クラスを記述して XmlSerializer で [de]serialize し、これと CookieContainer の間で手動で変換することもできます。

于 2009-11-22T00:01:34.440 に答える