我正在使用 .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 窗口中不工作...有人知道问题出在哪里吗?
重现很简单:
- 创建一个 WinForms 项目
- 将“WebBrowser”控件添加到对话框
- 双击 Form1
添加以下代码
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"); }
启动应用
- 按“使用 Stack Exchange 登录”帐户符号登录
- 加载新页面;显示正确,但无法输入登录名; 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/