C#-.NET 4 WebBrowser挂起

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

似乎无法完成登录,因为在显示“ StackExchange Login”中的页面后,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登录”帐户符号登录
>加载新页面;它显示正确,但是您不能输入您的登录名;窗户挂着…

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

关于如何解决这个问题的任何提示?

还是可以在WebBrowser-Control中调试JavaScript ???

解决方法:

修复WebBrowser控件

尝试登录时,我还遇到了WebBrowser控件处理的问题.

尽管在IE(11)中请求令牌有效,但我发现当我将其置于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事件捕获该URL.

剩余的问题

它实际上并不能完美地工作.第一次我也被重定向到一些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模式下运行,那将是很好的选择,但是至少这似乎是一个适当的解决方法.

上一篇:c#-更改下拉菜单列表项为正方形


下一篇:c#-在运行时使用Linq确定表