如何删除windows.form中的Cookie?

我正在使用C#编写的windows.form应用程序上的Webbrowser控件。 我想写一个方法来在Web浏览器控件访问某个站点后删除这些cookies。 不幸的是,我不知道如何做到这一点,并没有在互联网上find很多的帮助。

如果有人有这样的经历,不只是假设,因为它可能比似乎更棘手,我不知道。

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

我只是假设像上面的代码会起作用,但我猜这不会。 任何人都可以在这个整个cookies的事情?

如果您启用了JavaScript,则可以使用此代码段清除以清除Web浏览器当前所在网站的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。

我从这里修改了解决scheme: 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 ); } 

您可以在stream程开始的某个地方调用SupressCookiePersist,并在浏览器closures时清除Cookie,如此处所述: Facebook多帐户

我find了一个解决scheme,删除所有的cookies。 在url上find的例子,删除应用程序(进程)启动的cookie。

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

解决scheme是使用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 !>?"); } 

请注意,只清除特定“进程”的Cookie,如同在MSDN上编写INTERNET_OPTION_SUPPRESS_BEHAVIOR :

用于在stream程范围内抑制行为的通用选项。

尝试使用这个:

 System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename"); 

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

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

网页浏览器控件是否显示多页网站,作为开发人员,您无法控制网页,或者您只是使用网页浏览器控件查看您的应用程序中创build的自定义HTML页面?

如果是前者,则Cookie与设置它们的域直接相关,因此要删除这些Cookie,您需要监视用户的Cookie目录并删除所有创build的新Cookie,轨道将更改为现有的Cookie。

如果是更高版本,则可以将Web浏览器控件始终发送到自定义页面,该页面通过服务器端脚本(如果在应用程序中可用)或JavaScript删除cookie。

我使用这个代码,它没有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 ,我特别search=和过期cookie= 。 这对于过期没有任何价值的cookie很重要。

陷阱:

  • 您只能删除您导航的网站的Cookie。
  • 如果页面被redirect到一个不同的域,您删除的cookie可能来自redirect的域。 或者不是,这是redirect和你的代码之间的竞赛。
  • ReadyState = WebBrowserReadyState.Complete ,不要访问Document ,否则Document将是Nothing,并且解除引用会抛出exception。
  • 也许很多其他人,但这个代码对我很好。

带有View Cookies Add-On的 Firefox在debugging特定的网页方面有很多帮助。

 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());}}}})())") 

经过了很长的时间,find如何在Web浏览器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());}}}})())") 

上面这个话题对Jordan Milne怎么说呢?

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

这里不工作,如果您使用C#属性。

我希望你发现这个信息有用。

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

 System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");