3

我正在尝试切换到另一个框架(没有名称或 ID),但出现异常。

object index = 0;
var frame = (mshtml.IHTMLWindow2)workDocument.frames.item(ref index);
frameDocument = (mshtml.IHTMLDocument2)frame.document; // Exception.

尝试了其他方式,但同样的例外:

webBrowser.Document.Window.Frames[0].Document.GetElementById("userName").SetAttribute("value", username);
webBrowser.Document.Window.Frames[0].Document.GetElementById("userPassword").SetAttribute("value", password);
webBrowser.Document.Window.Frames[0].Document.GetElementById("login").InvokeMember("click");

例外:

访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

我知道这是一个跨域的原因,我们是否有针对这种情况的解决方案

谢谢

4

1 回答 1

2

您可以捕获并忽略异常,或调整安全设置以允许跨域脚本:

  • 从 WebBrowser 派生一个类
  • 创建一个从 WebBrowser.WebBrowserSite 派生的嵌套类(您可以从嵌套类派生的唯一方法)
  • 覆盖 CreateWebBrowserSiteBase 并返回您的 webbrowser 站点的新实例。
  • 在 webbrowser 站点上实现 IServiceProvider
  • 实现 IServiceProvider.QueryService 以便在请求 SID_SInternetHostSecurityManager 服务时返回 IInternetHostSecurityManager 实现
  • 处理 IInternetHostSecurityManager.GetSecurityId 并为您希望跨域脚本使用的所有站点返回相同的域 ID。对于其他网站,给每个域一个不同的 id。请注意,这会使您的应用程序面临跨域脚本攻击,因此您需要信任所有共享相同 ID 的域。
  • 在表单中使用新的网络浏览器
于 2016-05-16T02:45:24.173 回答