【发布时间】:2011-01-26 13:50:04
【问题描述】:
编辑:据我所知,这个问题没有解决方案,这再次证明了人们不应该使用 C# 的 WebBrowser。我们最终在程序开始时出现了一个警告标志,通知用户 IE 的 cookie 将被清除。
我正在尝试做的简短版本在标题中。这是长版。
我有一个复杂的问题,我相信我会收到很多猜测作为回应。为了尽量减少善意但不幸无用的猜测,让我先提一下,这个问题的解决方案并不简单,所以很遗憾,简单的建议根本无济于事,尽管我很感激你的努力。
.NET WebBrowser 组件本质上是 IE 本身,因此带有任何警告的解决方案几乎肯定不会起作用。我需要做我想做的事,即使是一个看似微不足道的警告也会完全破坏目标。冒着听起来傲慢的风险,我需要真正深入了解 .NET WebBrowser 和/或 WinInet 和/或如何从 C# 与 Windows 的底层系统通信...或如何将 C++ 代码封装在C#。
也就是说,我不希望任何人为我这样做,而且我发现了一些很有希望的提示,这些提示将在本问题的后面进行解释。
但首先……我想要实现的是这个。
我有一个包含 WebBrowser 控件的 Windows.Forms 组件。该控件需要:
- 清除所有网站的所有 cookie。
- 依次访问多个网站,记录cookies并正确处理。这部分工作正常,所以我对此没有任何问题。
- 冲洗并重复...理论上永远。
现在,真正的问题来了。我需要清除所有这些 cookie(对于任何和所有站点),但仅限于 WebBrowser 控件本身,而不是 IE 正确使用的 cookie。这种方法的根本错误当然在于 .NET WebBrowser 控件是 IE。但我是一个顽固的年轻人,我坚持这是可能的,否则! ;)
这就是我现在卡住的地方。
仅通过 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);
然后所有的 cookie 都会被清除,因此我很高兴。该程序完全按照预期运行,除了它还清除了 IE 的 cookie,这是绝对不允许发生的。
来自 StackOverflower 的一位同事(如果这是一个词),姜升在评论中针对不同的问题提出了这个问题,但没有进一步详细说明:
"如果您想隔离应用程序的 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
我想我大概知道这些东西的作用,我只是不知道如何使用它们。
【问题讨论】:
-
.NET Web 浏览器控件(显然没有 C# Web 浏览器控件)是一个包装器。 iexplore.exe 是一个包装器。它们都是同一事物的包装器。我认为您无法做到这一点,因为它们都可以访问完全相同的组件。
-
另请注意,您发布的文档链接指的是“WebBrowser 控件”。这里指的是 Win32 控件,而不是 .NET 版本。
-
是的,这正是我迷路的原因。如果它是 .NET 版本,那么我没有问题。 :)
-
我想在你的应用程序中嵌入 Firefox Gecko 引擎或 Chrome Webkit 引擎而不是 IE 是不可能的?两者都有 .NET 控件,无论你用它们做什么,它都不会影响 IE。
-
@Joel:显然,是的。但是,如果在不破坏 IE 中的 cookie 的情况下完全不可能做到这一点,那么我可以为使用 Gecko 引擎提出一个更强有力的理由,这无论如何都是我个人的偏好,但过去曾被管理层拒绝。不过感谢您的评论。
标签: c# .net internet-explorer cookies browser