我有一个 CookieContainer 从中提取HttpWebRequest/HttpWebResponse届会议命名为 CookieJar.我想要应用储存的饼干之间的运行,以收集在饼干 CookieContainer 在一个运行的程序,将使用下运行,太。

我认为这样做的方法将以某种方式编写的内容cookiecontainer中的cookie,以便给磁盘。我的问题是:

  • 你怎能 写cookiecontainer中的cookie,以便给对盘?都有内在的功能,用于这一点,或者,如果没有,有什么办法的人采取了?是否有任何课程可以简化这个吗?
  • 一旦你已经写了一个cookiecontainer中的cookie,以便给向盘, 你如何装载回来在为使用?

更新: 第一次回答已经提出 CookieContainer.但是,我不是很熟悉如何序列化和deserialize这样复杂的对象。你能提供一些 代码样本?有与会者建议利用 SOAPFormatter.

有帮助吗?

解决方案

我还没有尝试过,但它具有属性的序列化和因此可以[德]化。净的二进制序列,例如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现在已经过时。净3.5并建议您使用Binaryformatter.在过去,我们发现SoapFormatter有用,因为该文件是可读的,它可以帮助诊断当反失败!这些格式敏感的版本变化,甚至在大会的版本(如果你deserialize一个版本的框架升级的框架,那么它可能会不deserialize,不确定),但是有办法绕过这种粘合剂的财产,如果这成为一个问题。我相信他们是主要设计用于短期坚持不懈/远程处理的,但他们可能不够好你在这里。

新DataContractSerializer似乎并没有与它的工作,以便为。

一个替代办法将是编写一个CookieContainerData类[德]serialize有序列化程序和手工转换之间的这一和cookiecontainer中的cookie,以便给.

其他提示

这个问题是缠着我的年龄,没有什么我能找到工作。我的工作了,所以把这些信息到世界各地。

回答使用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(); 
        }
    }

有趣的是有 饼干在文本格式.除了能够被用来写入磁盘,可以用于其他目的。

为我工作!

使用 LoadCookiesFromFileSaveCookiesToFile 功能负荷写的饼干盘分别。

或者使用 GetCookiesSetCookies 功能要做同样的事情,但是操作它作为一串。

CookieContainer cookieContainer = new CookieContainer();

void LoadCookiesFromFile(string path)
{
    SetCookies(cookieContainer, File.ReadAllText(path));
}

void SaveCookiesToFile(string path)
{
    File.WriteAllText(path, GetCookies(cookieContainer));
}

string GetCookies(CookieContainer cookieContainer)
{
    using (MemoryStream stream = new MemoryStream())
    {
        new BinaryFormatter().Serialize(stream, cookieContainer);
        var bytes = new byte[stream.Length];
        stream.Position = 0;
        stream.Read(bytes, 0, bytes.Length);
        return Convert.ToBase64String(bytes);
    }
}

void SetCookies(CookieContainer cookieContainer, string cookieText)
{
    try
    {
        var bytes = Convert.FromBase64String(cookieText);
        using (MemoryStream stream = new MemoryStream(bytes))
        {
            cookieContainer = (CookieContainer)new BinaryFormatter().Deserialize(stream);
        }
    }
    catch
    {
        //Ignore if the string is not valid.
    }
}

另一种替代方法是使用Json化(Json.NET):

// other includes
using Newtonsoft.Json;

一个类cookie:

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

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

这里是如何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();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top