我在使用C#编写的windows.form应用程序上使用Webbrowser控件。我想写一个方法,在访问某个站点后从Webbrowers控件中删除cookie。不幸的是,我不知道如何做到这一点,并没有在互联网上找到很多帮助。
如果有人有这方面的经验,不仅仅是假设,因为它可能比看起来更棘手,我不知道。
int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);
我只是假设上面的代码会起作用,但我想它不会。任何人都可以对这整个饼干有所了解吗?
答案 0 :(得分:25)
如果您启用了JavaScript,则可以使用此代码段清除以清除webbrowser当前所在网站的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());}}}})())")
它来自this bookmarklet,用于清除Cookie。
答案 1 :(得分:13)
我从这里修改了解决方案: 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 multi account
答案 2 :(得分:9)
我找到了一个解决方案,用于删除所有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 !>?");
}
请注意,只有在MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR上写的时才会清除特定流程的Cookie:
用于抑制某些行为的通用选项 整个过程的基础。
答案 3 :(得分:3)
尝试使用:
System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");
答案 4 :(得分:3)
其他建议答案的变体,不需要不安全的代码或手动编组:
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);
答案 5 :(得分:1)
webbrowser控件是否显示您作为开发人员无法控制的多个站点的页面,或者您只是使用Web浏览器控件来查看在您的应用程序中创建的自定义HTML页面?
如果是前者,则cookie直接与设置它们的域绑定,因此要删除这些cookie,您需要监视用户的cookie目录并删除创建的任何新cookie,跟踪更改为现有cookie。
如果是后者,您可以随时将webbrowser控件发送到自定义页面,该页面使用服务器端脚本(如果在您的应用程序中可用)或JavaScript删除cookie。
答案 6 :(得分: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());}}}})())")
答案 7 :(得分:1)
基于Internet Explorer的Web浏览器控件,因此当我们删除IE cookie时,Web浏览器cookie也会被删除。所以通过this回答你可以试试这个:
System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");
答案 8 :(得分:0)
我正在使用此代码,它可以在没有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
并过期=
,而不仅仅是cookie=
到期。这对于过期没有价值的cookie非常重要。
缺陷:
Document
之前不要访问ReadyState = WebBrowserReadyState.Complete
,否则Document将为Nothing,并且取消引用将引发异常。使用View Cookies Add-On的Firefox在调试特定网页方面提供了很多帮助。
答案 9 :(得分:0)
在很长一段时间内发现了如何使用代码来破坏Web浏览器中的会话:
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(&#34; xxx&#34;);
如果您使用C#属性,此处不起作用。
我希望你发现这些信息很有用。