编辑:据我所知,这个问题没有解决方案,这又证明了一个事实:不应该使用 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 控件isIE。但我是个固执的年轻人,我坚持认为这是可能的,否则! ;)
这就是我现在被困的地方。
仅通过 C# 以编程方式清除 WebBrowser 控件的所有 cookie 是完全不可能的。人们必须使用 DllImport 以及它附带的所有疯狂的东西。这个块可以很好地达到这个目的:
[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);
然后所有的cookies都被清除了,因此我很高兴。该程序完全按照预期工作,除了它还清除 IE 的 cookie 之外,这是绝对不允许发生的。
来自 StackOverflower 的一位同事(如果这是一个词的话),Sheng Jiang 在评论中针对另一个问题提出了这一点,但没有进一步详细说明:
“如果您想隔离应用程序的 cookie,则需要通过 IDocHostUIHandler2::GetOverrideKeyPath 覆盖缓存目录注册表设置”
我在互联网上查找了 IDocHostUIHandler2 和 GetOverrideKeyPath,但我不知道如何在 C# 中使用它们将 cookie 隔离到我的 WebBrowser 控件。我对Windows注册表的经验仅限于RegEdit(所以我知道它是一个具有不同数据类型的树结构,但仅此而已......例如,我对注册表与IE的关系没有深入的了解)。
这是我在 MSDN 上查到的:
IDocHostUIHandler2 文档:http://msdn.microsoft.com/en-us/library/aa753275%28VS.85%29.aspx 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 http://msdn.microsoft.com/en-us/library/aa753274%28VS.85%29.aspx
我想我大概知道what这些事情确实如此,我只是不知道how使用它们。