在 WebBrowser 控件中设置 cookie

Posted

技术标签:

【中文标题】在 WebBrowser 控件中设置 cookie【英文标题】:Setting a cookie in a WebBrowser control 【发布时间】:2011-02-19 07:26:36 【问题描述】:

我正在使用 WebBrowser 的导航功能加载网站,我希望浏览器加载带有我给它的 cookie 的页面。

以下代码不起作用:

wb.Navigate(url, null, null, "Cookie: " + cookie + "\n");

我做错了什么?我必须使用InternetSetCookie 吗?这似乎不是最好的解决方案。

【问题讨论】:

你找到答案了吗? 【参考方案1】:

The proper way is using InternetSetCookieEx.

[DllImport("wininet.dll")]
static extern InternetCookieState InternetSetCookieEx(
    string lpszURL,
    string lpszCookieName,
    string lpszCookieData,
    int dwFlags,
    int dwReserved);

enum InternetCookieState : int

    COOKIE_STATE_UNKNOWN = 0x0,
    COOKIE_STATE_ACCEPT = 0x1,
    COOKIE_STATE_PROMPT = 0x2,
    COOKIE_STATE_LEASH = 0x3,
    COOKIE_STATE_DOWNGRADE = 0x4,
    COOKIE_STATE_REJECT = 0x5,
    COOKIE_STATE_MAX = COOKIE_STATE_REJECT
 

这里有一些代码可以在website that shows your HTTP headers 进行测试。

InternetSetCookieEx("http://request.urih.com/", null, "TestData=Test;", 0, 0);
webBrowser1.Navigate("http://request.urih.com/");

【讨论】:

当我这样做时,我得到了重复的 cookie。尝试了带有和不带有斜杠的 cookie 域。尝试了带和不带分号的值。已尝试不修剪名称/值对并进行修剪。我只是想知道您是否在生产中发现了问题,修复了 cookie 的设置,并且可能没有更新您的答案。 澄清一下,当我设置已保存在数据库中的 cookie,然后第 3 方网站设置它们时,它们最终会重复。 @Valamas 是的,使用相同的值多次调用 InternetSetCookie 会以重复的 cookie 结尾,您需要使用 InternetGetCookie 检查并防止这种情况发生,或者将 cookie 集合保存在某处进行比较。【参考方案2】:

瘦控制的 cookie 有问题。使用 cookie 的导航方法有重载:

string cookie = webBrowser1.Document.Cookie.ToString(); webBrowser1.Navigate(url,"",null, cookie);

在我的情况下,问题是通过重定向到页面两次(或重复三次)解决的,所以看起来这个控件自动启用 cookie:

           `webBrowser1.Navigate(url);
            waitforwebsite(300, webBrowser1);
            webBrowser1.Navigate(url);
            waitforwebsite(300, webBrowser1);
            webBrowser1.Navigate(url);`

【讨论】:

【参考方案3】:

看来有更好的办法:

导入InternetSetCookie函数:

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetSetCookie(string lpszUrlName, string lpszCookieName, string lpszCookieData);

创建Cookie 对象:

Cookie temp1 = new Cookie("KEY1", "VALUE1", "/Path/To/My/App", "/");

调用 InternetSetCookie 函数为该 URL 设置 cookie

InternetSetCookie("https://my.url.com/Path/To/My/App", null, temp1.ToString() + "; expires = Sun, 01-Jan-2013 00:00:00 GMT");

Navigate WebBrowser 到您想访问的 URL。

webBrowser1.Navigate("https://my.url.com/Path/To/My/App");

认为这是解决问题的最佳方法:)。

【讨论】:

对于任何试图从 DateTime 对象中获取 'expires =' 部分的人,这里是如何做到这一点的: myDateTimeObj.ToUniversalTime().ToString("ddd, dd-MMM-yyyy HH :mm:ss") + "GMT" 如果只需要在内存中为会话设置cookie,可以直接调用:InternetSetCookieEx("my.url.com/Path/To/My/App", "KEY1", "VALUE1", NULL, NULL)。注意:调用 InternetSetCookie 和 InternetSetCookieEx (blogs.msdn.com/b/ieinternals/archive/2009/08/20/…) 是有区别的。在实践中,我观察到页面发出的任何后续请求仅在您使用“Ex”方法时才包含 cookie。 我尝试了您的代码,但无法在我的测试网站request.urih.com 上显示 cookie。我使用 InternetSetCookieEx 发布了我的解决方案。

以上是关于在 WebBrowser 控件中设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WebBrowser Control 中为任意域设置和删除 cookie

在 WPF WebBrowser 控件中管理 cookie?

C# WebBrowser 控件:清除缓存而不清除 cookie

在C# WinForm 里WebBrowser这个控件能清楚Cookie和浏览器里的缓存么?要代码 急急急急急

VB WebBrowser如何独立COOKIE,解决了100分?

webbrowser怎么清空cookies