WebBrowser控件无法触发事件处理程序

时间:2015-11-05 05:10:50

标签: c# windows-phone-8.1 webbrowser-control

在特定情况下,WebBrowser控件无法触发NavigationCompleteNavigationFailed事件处理程序。

以下是应该发生的事情:

  1. 原生Windows Phone 8.1 Silverlight应用实例化WebBrowser并为其提供加载身份验证网页的网址。
  2. WebBrowser控件加载网址并呈现网页。
  3. 用户输入凭据并点按提交按钮以将信息发布到身份验证服务。
  4. 验证服务验证凭据并使用302(重定向)进行响应。
  5. WebBrowser控制遵循重定向。
  6. NavigationComplete事件处理程序附加到控件。当它找到指示重定向成功的url模式时,它会执行另一个方法。
  7. 附加方法从重定向url查询参数中提取openid令牌。
  8. 用户经过身份验证并感到满意。
  9. 实际发生的事情:

    用户在步骤3中提交凭据后,WebBrowser会呈现空白页,但不会触发任何事件处理程序。代码正在侦听WebBrowser控件提供的每个导航事件处理程序。

    我尝试了什么:

    • 使用测试heroku服务器尽可能密切地重新创建场景。 WebBrowser转到虚拟凭据输入页面,其中有一个POST提交按钮,再次点击heroku; heroku以302和真正的重定向url响应。 WebBrowser可以正常使用O_o
    • onTap添加了WebBrowser个事件,用于检查当前网址/导航到另一个网页,以查看在空白网页错误后控件是否以某种方式损坏。 WebBrowser正确回应。
    • 确保在控件上启用了Javascript。
    • 使用与Windows 8平板电脑应用完全相同的服务器端基础架构,该应用共享90%的相同代码但具有WebView控件。 WebView工作得很好。

    有什么建议吗?有没有人经历过这样的控制呢?有没有人知道可以解决这个问题的库(商业或开源)。 Android bridge for WindowsiOS bridge for Windows是否支持Windows Phone 8?

1 个答案:

答案 0 :(得分:1)

戴夫,

WebBrowser控件旨在直接在UI线程中工作,并且通过上面所说的,您可能在非UI线程中运行它,这种情况应该是......期望的意外行为。

如果是这种情况,您可能会尝试将线程转换为单线程单元(STA)线程,因为apatment模型对于COM组件(例如ActiveX组件,WebBrowser类所属的)和你可以这样做:

yourThread.SetApartmentState(ApartmentState.STA);

有关STA线程的更多信息,请参阅this page

由于WebBrowser控件是一个AciveX组件,因此this page的内容也具有相关性,并指出相同的问题。

希望它有所帮助。 ;)