Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从windows.form中删除Cookie?_C#_Cookies_Webbrowser Control - Fatal编程技术网

C# 如何从windows.form中删除Cookie?

C# 如何从windows.form中删除Cookie?,c#,cookies,webbrowser-control,C#,Cookies,Webbrowser Control,我正在使用用C#编写的windows.form应用程序上的Webbrowser控件。我想写一个方法,在Webbrowers控件访问某个站点后,从该控件中删除cookies。不幸的是,我不知道如何做到这一点,也没有在互联网上找到很多帮助 如果有人真的有这样做的经验,而不仅仅是假设性的,因为这可能比看起来更棘手,我不知道 int count = webBrowser2.Document.Cookie.Length; webBrowser2.Document.Cookie.Remove(0,count

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

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

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

我只是假设上面的代码会起作用,但我猜不会。有人能解释一下整个cookie吗?

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

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


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

如果启用了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());}}}})())")
webBrowser.Navigate(“javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split(“;”);for(e=0;e)用于清除cookies.

webBrowser.Navigate(“javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split(“;”));for(e=0;e尝试使用以下方法:

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());}}}})())")
System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");

我正在使用这段代码,它在没有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很重要

陷阱:

  • 您只能删除已导航到的网站的Cookie
  • 如果页面被重定向到另一个域,您删除的cookie可能来自重定向域。或者不是,这是重定向和代码之间的竞争
  • ReadyState=WebBrowserReadyState.Complete
    之前不要访问
    文档
    ,否则文档将为空,取消引用将引发异常
  • 可能还有很多其他的,但是这段代码对我来说非常有用

Firefox在调试特定网页方面帮助很大。

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

解决方案是使用 函数来宣布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上的说明清除特定流程的Cookie:

一个通用选项,用于抑制网络上的行为 全过程基础


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

webBrowser.Navigate(“javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split(“;”);for(e=0;e我从这里修改了解决方案:

实际上,您不需要不安全的代码。以下是适用于我的helper类:

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
    );
}
您在流程开始时调用SupersCookiePersist,然后 EndBrowserSession在浏览器关闭时清除Cookie,如下所述:
其他建议答案的变体,不需要不安全代码或手动编组:

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

基于Internet Explorer的web浏览器控件,因此当我们删除IE cookies时,web浏览器cookies也会被删除。因此,通过回答,您可以尝试以下操作:

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

我很好奇。设置对象“webBrowser2”会吗"要重置WebBrowser控件的新实例,请重置cookie?不,您必须实际删除它们。只需知道要查找的正确目录并捕获正在使用的文件的访问被拒绝的异常。我知道cookie是什么。我需要删除特定的cookie。HtmlDocument.cookie文档说明您只能设置我猜WebBrowser控件不会使用CookieContainer对象之类的东西,我们可以通过重置来重置所有cookie,嗯?我在google上的某个地方读到WebBrowser控件cookie存储在与IE分离的应用程序缓存中。我不介意从windows中的cookie文件夹中删除所有cookie,但我不介意我只是不确定这是否能解决问题。嗯,目前可能是这样。我上次使用WebBrowser控件是使用VB6的,所以他们现在肯定已经改进了。无论如何,我不会删除所有用户的cookies。这只是意味着。我在那些cookies中存储了我淘气网站的密码。=)很好,让我测试一下你的建议,看看它是否有效,如果有效,我会给你检查。作为一个补充说明,如果你需要能够清除所有站点的cookie,你可能最好使用axWebBrowser COM对象之类的东西。NET的内置WebBrowser控件非常锁定。我只在切换到ax时使用这个WebBrowser不是一个选项,浏览器只需要能够浏览一个站点。谢谢你,先生。我一直在寻找这样的代码。感谢注意:HttpOnly cookies对javascript不可用。这并不总是有效。有时,浏览器控件使用随机命名的文件来填充cookies这将尝试删除一个文件named“Cookiescookiename”…可能不是你想要的。这似乎是Javascript可见cookies的合理解决方案。但不是HttpOnly cookies。对我来说也很好,结束了数小时的研究,为什么我的ADFS服务器总是停留在同一声明提供商Trust,ev的登录上