编辑:据我所知,这个问题没有解决方案,这再次证明了不应使用 C# 的 WebBrowser 这一事实。我们在程序开始时以警告标志告终,通知用户将针对 IE 清除 cookie。
我正在尝试做的简短版本在标题中。这是长版。
我有一个有点复杂的问题,我相信我会收到很多猜测作为回应。为了将善意但不幸的是无用的猜测降到最低,让我首先提到这个问题的解决方案并不简单,所以不幸的是简单的建议根本没有帮助,即使我很感激你所做的努力。
.NET WebBrowser 组件基本上是 IE 本身,因此带有任何警告的解决方案几乎肯定不会起作用。我需要做我想做的事情,即使是一个看似微不足道的警告也会完全打败我的目的。冒着听起来傲慢的风险,我需要真正深入了解 .NET WebBrowser 和/或 WinInet 和/或如何从 C# 与 Windows 的底层系统进行通信的人的帮助......或者如何将 C++ 代码封装在C#。
也就是说,我不希望任何人为我做这件事,而且我发现了一些有希望的提示,这些提示稍后会在这个问题中进行解释。
但首先...我想要实现的是这个。
我有一个包含 WebBrowser 控件的 Windows.Forms 组件。此控件需要:
- 清除所有网站的所有 cookie。
- 依次访问多个网站,并记录 cookie 并正确处理它们。这部分已经可以正常工作了,所以我对此没有任何问题。
- 冲洗并重复……理论上永远。
现在,真正的问题来了。我需要清除所有这些 cookie(对于任何和所有站点),但仅限于 WebBrowser 控件本身,而不是 IE 正确使用的 cookie。这种方法的根本错误当然是 .NET WebBrowser 控件是 IE。但我是一个固执的年轻人,我坚持认为这是可能的,否则! ;)
这就是我目前遇到的问题。
仅通过 C# 以编程方式清除 WebBrowser 控件的所有 cookie 是完全不可能的。必须使用 DllImport 和它附带的所有疯狂的东西。这个 block 可以很好地用于此目的:
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
然后,在实际清除 cookie 的函数中:
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
然后所有 cookie 都被清除,因此,我很高兴。该程序完全按预期工作,除了它还清除 IE 的 cookie 之外,这是不允许发生的。
来自 StackOverflower 的一位同事(如果这是一个词),Sheng Jiang 在评论中针对不同的问题提出了这个,但没有进一步详细说明:
“如果您想隔离应用程序的 cookie,您需要通过 IDocHostUIHandler2::GetOverrideKeyPath 覆盖缓存目录注册表设置”
我在 Internet 上四处寻找 IDocHostUIHandler2 和 GetOverrideKeyPath,但我不知道如何在 C# 中使用它们将 cookie 隔离到我的 WebBrowser 控件。我对 Windows 注册表的经验仅限于 RegEdit(所以我知道它是一个具有不同数据类型的树结构,但仅此而已......例如,我对注册表与 IE 的关系没有深入的了解)。
这是我在 MSDN 上找到的内容:
IDocHostUIHandler2 文档: http://msdn.microsoft.com/en-us/library/aa753275%28VS.85%29.aspx
GetOverrideKeyPath 文档: http://msdn.microsoft.com/en-us/library/aa753274%28VS.85%29.aspx
我想我大概知道这些东西的作用,只是不知道如何使用它们。
最佳答案
是否需要同时在 IE 中使用 cookies? 程序运行后是否可以将原始 cookies“恢复”回 IE?
更新:
另一个想法:
我想知道如果您通过模拟在不同的用户帐户下运行您的程序会发生什么。它可能会将这些 cookie 存储在不同的 Windows 配置文件下...
关于c# - 清除 Web 浏览器控制所有站点的 cookie,而不清除 IE 本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428509/