我正在使用.NET 4并尝试通过Web浏览器控件(WPF和/或WinForms)为StackApps站点使用桌面身份验证来开发用于访问StackOverflow(https://stackapps.com/questions/4215/stackapp-nntp-bridge-for-accessing-stackexchange-forums-like-stackoverflow)的NNTP桥。 / p>
似乎登录无法完成,因为在显示“StackExchange Login”页面后,Web浏览器会挂起。 我使用以下URL: https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success
它适用于普通的IE浏览器,但不适用于WinForms或WPF窗口......有谁知道问题是什么?
重新制作很简单:
添加以下代码
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");
}
启动应用程序
同样的情况发生,如果我使用WPF-App和WPF-WebBrowser-Control ...它似乎陷入了无休止的JavaScript循环......
有关如何解决问题的任何提示?
或者可以在WebBrowser-Control ???中调试JavaScript
答案 0 :(得分:2)
修复WebBrowser控件
我在尝试登录时也遇到了WebBrowser控件处理的问题。
虽然在IE(11)中请求令牌有效,但我发现IE本身在我将其置于IE 7仿真模式时也会挂起。这告诉我,我之前尝试使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位可执行文件,您可能还需要将其添加到第二个密钥,尽管我也确定该规则是否也适用于.NET。我不是每天都做C#,而是我试图让它在Delphi中首先工作,但是如果我有时间在C#中测试它,我会在这里发布更新。
最后,如果实际问题得到解决将会很好,并且JavaScript也可以在IE7模式下工作,但至少这似乎是一个合适的解决方法。
答案 1 :(得分:1)
不幸的是,我不是JavaScript开发人员,所以我只能尝试解释如何调试在WebBrowser
控件中执行的JavaScript。
这种方法适用于Microsoft Visual Studio,我不知道Delphi是否可以提供类似的功能。
WebBrowser
托管应用程序,无需调试(即, Ctrl + F5 )。现在,您可以查看脚本代码并调查代码本身,调用堆栈,变量值等。您也可以设置断点。也许你可以找到脚本挂起的地方。正如我之前所说,我不是网络开发人员,也无法帮助您...
<强>更新强>
我想我可以为你提供一个有效的解决方案。
我的调查显示WebBrowser
在 IE7 模式下呈现内容时会挂起(即使您的系统中有 IE10 ,默认模式也是如此)。您应该强制它切换到 IE9 模式。在 IE9 模式下,页面呈现良好,不会导致脚本卡在无限循环中。
您可以使用以下方法之一将WebBrowser
切换到 IE9 模式:
对于32位操作系统,请转到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
。
对于64位操作系统,请使用HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
。
在此节点中,使用值DWORD
(9000
)创建名为 YourApplicationExeName.exe 的新0x2710
参数。如果希望在Visual Studio调试模式下工作,可以为* .vshost.exe可执行文件创建另一个条目。
WebBrowser
的来源,将其切换为 IE9 模式。这会更复杂。您需要更改html文档的<head>
标记,最好添加新的<meta>
标记作为第一个元素:<meta http-equiv="X-UA-Compatible" content="IE=9"/>
。
这将导致WebBrowser
在文档呈现时切换其模式。由于您无法在呈现文档后更改兼容性模式,因此您可以使用代理作为WebBrowser
的来源,因此此代理将添加标题。
我用第一种方法成功测试了这个,第二种方法也应该有用。 希望有所帮助!
答案 2 :(得分:0)
Project + Properties,Debug选项卡,勾选“启用本机代码调试”选项。确保您已启用Microsoft Symbol服务器(工具+选项,调试,符号),我知道您这样做:)
您现在可以使用Debug + Break All查看浏览器内部的内容。反复这样做以获得土地。您将看到Javascript正在执行(jscript8.dll)并不断强制布局引擎重新计算布局,从未完成工作。
浏览器一般都容易受到Javascript的影响而无法循环。常规浏览器会在几十秒后建立一个对话框以允许用户中止JS,但WebBrowser没有该功能。它也没有开发工具,所以调试JS也不会是一个很大的乐趣。这很难修复。
您可以考虑使用OAuth 2.0 api。使用说明在this web page。究竟如何将它与WebBrowser集成对我来说有点模糊,我没有密钥来测试它。在Stackapps site寻求帮助。您可能不是第一个遇到此问题的SE api用户。