c# - .NET 4 WebBrowser 挂起

标签 c# .net wpf winforms webbrowser-control

我正在使用 .NET 4 并尝试通过 Web 浏览器控件(WPF 和/或 WinForms)使用 StackApps 站点的桌面身份验证来开发用于访问 StackOverflow 的 NNTP 桥(https://stackapps.com/questions/4215/stackapp-nntp-bridge-for-accessing-stackexchange-forums-like-stackoverflow)。

似乎无法登录,因为在显示“StackExchange 登录”页面后,Web 浏览器挂起。 我使用以下网址: https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success

它在普通的 IE 浏览器中工作,但在 WinForms 或 WPF 窗口中不工作...有人知道问题出在哪里吗?

重现很简单:

  1. 创建一个 WinForms 项目
  2. 将“WebBrowser”控件添加到对话框
  3. 双击 Form1
  4. 添加以下代码

    private void Form1_Load(object sender, EventArgs e)
    {
      webBrowser1.Navigate("https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success");
    }
    
  5. 启动应用

  6. 按“使用 Stack Exchange 登录”帐户符号登录
  7. 加载新页面;显示正确,但无法输入登录名; window 挂着……

如果我使用 WPF-App 和 WPF-WebBrowser-Control,也会发生同样的情况……它似乎陷入了 JavaScript 的无限循环……

关于如何解决这个问题有什么提示吗?

或者是否可以在 WebBrowser-Control 中调试 JavaScript???

最佳答案

修复 WebBrowser 控件

我在尝试登录时也遇到了 WebBrowser 控件处理的问题。

虽然在 IE (11) 中请求 token 有效,但我发现当我将其置于 IE 7 仿真模式时,IE 本身也会挂起。这向我表明,我之前尝试使 WebBrowser 控件使用较新版本的尝试失败了。

我找到了这篇文章,Web Browser Control Specifying the IE Version ,这表明对于 64 位模式下的 32 位应用程序,您需要设置不同的注册表值。

现在,我在注册表中添加了两个值:

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

在这两个文件中,我都添加了一个名为“MyExecutable.exe”的 DWORD 值(其中 MyExecutable 是我的可执行文件的实际名称)。它们每个的值都是 9000,这将适用于 IE9 及更高版本。使用 RegEdit 进行测试时请注意,它将默认为十六进制而不是十进制。此外,请确保它是 DWORD 值,而不是任何其他类型。

这似乎可以解决问题。我现在可以运行该应用程序,完成登录过程,最终我被重定向到我指定的 url,然后我可以使用 webbrowser 控件的 OnNavigate 事件捕获它。

遗留问题

它并不能真正完美地工作。第一次我也被重定向到某个 OpenID 页面,但至少表单没有挂起。在随后的尝试中,显然登录(之前成功)被记住了,我收到消息 “网页导航已取消” 并带有刷新页面的链接。当我单击该链接时,我会立即被重定向到我在请求登录表单时指定的 redirect_url。至少那部分有效,我得到了一个实际的 access_token 和一个到期时间,所以现在我很高兴。

更新:经过一些测试,原来是记住了之前的登录。这会导致请求 uri 立即指向 redirect_uri。我使用 OnBeforeNavigate 事件来检测这一点,但在这种情况下它没有被触发。我现在链接了 NavigateComplete2 事件,并且在这种情况下会触发该事件。

修复 .NET?

我认为 .NET 的解决方案应该是相同的:将可执行文件(以及 MyExecutabl.vshost.exe,用于在 Visual Studio 中进行调试)添加到第一个键。如果它是在 62 位 Windows 上运行的 32 位可执行文件,您可能还需要将它添加到第二个 key ,尽管我确定该规则是否也适用于 .NET。我不是每天都使用 C#,我试图先让它在 Delphi 中运行,但如果我有时间在 C# 中测试它,我会在此处发布更新。

最后,如果实际问题能够得到解决,并且 JavaScript 也可以在 IE7 模式下工作,那就太好了,但至少这似乎是一个合适的解决方法。

关于c# - .NET 4 WebBrowser 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17895156/

相关文章:

c# - 使用 Autofac 动态解决依赖关系

c# - 如何让 silverlight 从 MySQL 获取数据

c# - 如何获取 WPF 视觉对象的子边界框,不包括父对象

c# - 将命令绑定(bind)到 UserControl 内的 ViewModel

c# - 为什么 is 运算符在给定 null 时返回 false?

c# - 将 int 转换为 6 个字符的字母数字字符串的算法

.net - SQL Server 到 .Net 类型转换

c# - 变量用动态值初始化一次

c# 仍然返回错误的核心数

c# - 为什么这种简单的风格不适用?