24

我正在使用 C# 编写的 windows.form 应用程序上的 Webbrowser 控件。我想写一个方法,在访问某个站点后从 Webbrowers 控件中删除 cookie。不幸的是,我不知道该怎么做,也没有在互联网上找到很多帮助。

如果有人有实际这样做的经验,而不仅仅是假设的,因为它可能比看起来更棘手,我不知道。

int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);

我只是假设上面的代码可以工作,但我想它不会。任何人都可以对这整个饼干的事情有所了解吗?

4

10 回答 10

25

如果您启用了 JavaScript,您可以使用此代码片段来清除以清除网络浏览器当前所在站点的 cookie。

webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")

它源自此用于清除 cookie的书签。

于 2009-08-05T16:24:18.780 回答
18

我从这里修改了解决方案:http: //mdb-blog.blogspot.ru/2013/02/c-winforms-webbrowser-clear-all-cookies.html

实际上,您不需要不安全的代码。这是对我有用的助手类:

public static class WinInetHelper
{
    public static bool SupressCookiePersist()
    {
        // 3 = INTERNET_SUPPRESS_COOKIE_PERSIST 
        // 81 = INTERNET_OPTION_SUPPRESS_BEHAVIOR
        return SetOption(81, 3);
    }

    public static bool EndBrowserSession()
    {
        // 42 = INTERNET_OPTION_END_BROWSER_SESSION 
        return SetOption(42, null);
    }

    static bool SetOption(int settingCode, int? option)
    {
        IntPtr optionPtr = IntPtr.Zero;
        int size = 0;
        if (option.HasValue)
        {
            size = sizeof (int);
            optionPtr = Marshal.AllocCoTaskMem(size);
            Marshal.WriteInt32(optionPtr, option.Value);
        }

        bool success = InternetSetOption(0, settingCode, optionPtr, size);

        if (optionPtr != IntPtr.Zero) Marshal.Release(optionPtr);
        return success;
    }

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool InternetSetOption(
        int hInternet,
        int dwOption,
        IntPtr lpBuffer,
        int dwBufferLength
    );
}

您在进程开始时调用 SupressCookiePersist 并在浏览器关闭时调用 EndBrowserSession 以清除 cookie,如下所述: Facebook 多帐户

于 2016-02-25T14:42:47.177 回答
10

我找到了一个解决方案,用于删除所有 cookie。在 url 上找到的示例会在应用程序(进程)启动时删除 cookie。

http://mdb-blog.blogspot.com/2013/02/c-winforms-webbrowser-clear-all-cookies.html

解决方案是使用InternetSetOption 函数宣布 WEBBROWSER 以清除其所有内容。

int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
int* optionPtr = &option;

bool success = InternetSetOption(0, 81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/, new IntPtr(optionPtr), sizeof(int));
if (!success)
{
    MessageBox.Show("Something went wrong !>?");
}

请注意,这只会清除特定 PROCESS 的 cookie,如 MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR上所写:

一个通用选项,用于在整个流程范围内抑制行为。

于 2013-02-17T14:05:30.523 回答
4

其他建议答案的变体,不需要不安全的代码或手动编组:

    private static void SuppressCookiePersistence()
    {
        int flag = INTERNET_SUPPRESS_COOKIE_PERSIST;
        if (!InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SUPPRESS_BEHAVIOR, ref flag, sizeof(int)))
        {
            var ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
            throw ex;
        }
    }

    const int INTERNET_OPTION_SUPPRESS_BEHAVIOR = 81;
    const int INTERNET_SUPPRESS_COOKIE_PERSIST = 3;

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, ref int flag, int dwBufferLength);
于 2016-09-20T16:44:58.060 回答
4

基于 Internet Explorer 的网络浏览器控制,所以当我们删除 IE cookie 时,网络浏览器 cookie 也会被删除。所以通过这个答案你可以试试这个:

System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");
于 2017-08-14T11:04:29.957 回答
3

尝试使用这个:

System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");
于 2009-10-23T08:05:14.020 回答
1

Webbrowser 控件是否显示页面形成了您作为开发人员无法控制的多个站点,或者您只是使用 Web 浏览器控件查看在您的应用程序中创建的自定义 HTML 页面?

如果是前者,cookie 直接与设置它们的域相关联,因此要删除这些 cookie,您需要监控用户的 cookie 目录并删除任何创建的新 cookie,跟踪现有 cookie 的更改。

如果是后者,您始终可以将 webbrowser 控件发送到自定义页面,该页面使用服务器端脚本(如果在您的应用程序中可用)或 JavaScript 来删除 cookie。

于 2009-05-26T21:21:56.297 回答
1
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
于 2009-08-28T08:18:33.047 回答
1

我正在使用这段代码,它在没有 JavaScript 的情况下工作。它与 JavaScript 做同样的事情,但在 VB.NET 中。此外,不需要导航。

For Each cookie As String In Document.Cookie.Split(";"c)
    Dim domain As String = "." + url.Host
    While domain.Length > 0
        Dim path As String = url.LocalPath
        While path.Length > 0
            Document.Cookie = cookie.Split("="c)(0).Trim & "= ;expires=Thu, 30-Oct-1980 16:00:00 GMT;path=" & path & ";domain=" & domain
            path = path.Substring(0, path.Length - 1)
        End While
        Select Case domain.IndexOf(".")
            Case 0
                domain = domain.Substring(1)
            Case -1
                domain = ""
            Case Else
                domain = domain.Substring(domain.IndexOf("."))
        End Select
    End While
Next

与 JavaScript 唯一真正的区别是cookie=value,我在哪里专门搜索=和 expire而不是 expiring cookie=。这对于过期的没有价值的 cookie 很重要。

陷阱:

  • 您只能删除您浏览过的网站的 cookie。
  • 如果页面被重定向到不同的域,您删除的 cookie 可能来自重定向的域。与否,这是重定向和您的代码之间的竞赛。
  • 不要访问Documentuntil ReadyState = WebBrowserReadyState.Complete,否则 Document 将是 Nothing 并且取消引用将引发异常。
  • 可能还有很多其他人,但这段代码对我很有用。

带有View Cookies Add-On的Firefox 对调试特定网页有很大帮助。

于 2009-11-11T14:14:56.893 回答
0

在找到如何在 webbrowser C# 中销毁会话之后,我已经成功使用代码:

webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")

在上面的这个话题中,乔丹·米尔恩怎么说。

在我的应用程序中,我需要使用 webbrowser1.navigate("xxx");

如果您使用 C# 属性,则此处不起作用。

我希望您发现此信息对您有用。

于 2013-09-18T20:04:38.453 回答