【问题标题】:Clearing WebBrowser control's cookies for all sites WITHOUT clearing for IE itself清除 Web 浏览器控制所有站点的 cookie,而不清除 IE 本身
【发布时间】:2011-01-26 13:50:04
【问题描述】:

编辑:据我所知,这个问题没有解决方案,这再次证明了人们不应该使用 C# 的 WebBrowser。我们最终在程序开始时出现了一个警告标志,通知用户 IE 的 cookie 将被清除。

我正在尝试做的简短版本在标题中。这是长版。

我有一个复杂的问题,我相信我会收到很多猜测作为回应。为了尽量减少善意但不幸无用的猜测,让我先提一下,这个问题的解决方案并不简单,所以很遗憾,简单的建议根本无济于事,尽管我很感激你的努力。

.NET WebBrowser 组件本质上是 IE 本身,因此带有任何警告的解决方案几乎肯定不会起作用。我需要做我想做的事,即使是一个看似微不足道的警告也会完全破坏目标。冒着听起来傲慢的风险,我需要真正深入了解 .NET WebBrowser 和/或 WinInet 和/或如何从 C# 与 Windows 的底层系统通信...或如何将 C++ 代码封装在C#。

也就是说,我不希望任何人为我这样做,而且我发现了一些很有希望的提示,这些提示将在本问题的后面进行解释。

但首先……我想要实现的是这个。

我有一个包含 WebBrowser 控件的 Windows.Forms 组件。该控件需要:

  1. 清除所有网站的所有 cookie。
  2. 依次访问多个网站,记录cookies并正确处理。这部分工作正常,所以我对此没有任何问题。
  3. 冲洗并重复...理论上永远。

现在,真正的问题来了。我需要清除所有这些 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


【解决方案1】:

是否需要同时在 IE 中启用 cookie? 是否可以在程序运行后将原始 cookie “恢复”回 IE?

更新:

另一个想法:

我想知道如果您通过模拟在不同的用户帐户下运行程序会发生什么。它可能会将这些 cookie 存储在不同的 Windows 配置文件下...

【讨论】:

  • 嗯...根本不是疯狂的想法!我不喜欢前一个想法是这个程序是为用户设计的......我们都知道那些是什么样的。模拟的想法也很有趣,虽然我敢打赌,我会在 Windows XP 及之前的客户端上遇到问题......但我会检查一下,谢谢!
  • 如果有 10 级的人发布这个作为答案,他们肯定会被嘲笑。
【解决方案2】:

How to set and delete cookies from WebBrowser Control for arbitrary domains 的评论是错误的。 WinInet 缓存文件夹设置显然不在 IE 设置中,而是一个 Shell 文件夹设置,因为 IDocHostUIHandler2 只能自定义存储在 IE 注册表项中的设置,因此对于此任务没有用处。 我不知道自定义文件夹位置的方法,除了挂钩所有 WinInet API(并且坚持更新应用程序以适应未来的 WinInet API),这在 C# 中并不容易。我现在将更新旧帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2017-08-04
    • 2016-07-16
    • 2016-06-02
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多