切换到其他框架(.Net WebBrowser、MsHTML)时拒绝访问跨域异常
Access denied on switching to other frame (.Net WebBrowser, MsHTML) cross-domain Exception
我正在尝试切换到另一个框架(没有名称或 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");
异常:
Access is denied. (Exception from HRESULT: 0x80070005
(E_ACCESSDENIED))
我知道这是一个跨域的原因,我们有针对这种情况的解决方案吗
谢谢
您可以捕获并忽略异常,或者调整安全设置以允许跨域脚本:
- 从 WebBrowser
导出 class
- create a nested class derived from WebBrowser.WebBrowserSite(您可以从嵌套 class 派生的唯一方法)
- 覆盖 CreateWebBrowserSiteBase 和 return 您的网络浏览器站点的新实例。
- 在网络浏览器站点上实施 IServiceProvider
- 实现 IServiceProvider.QueryService,因此在请求 SID_SInternetHostSecurityManager 服务时,它 return 是一个 IInternetHostSecurityManager 实现
- 处理 IInternetHostSecurityManager.GetSecurityId 和 return 您希望跨域脚本处理的所有站点的相同域 ID。对于其他网站,给每个域一个不同的 ID。请注意,这会使您的应用程序受到跨域脚本攻击,因此您需要信任共享同一 ID 的所有域。
- 在表单中使用新的网络浏览器
我正在尝试切换到另一个框架(没有名称或 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");
异常:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
我知道这是一个跨域的原因,我们有针对这种情况的解决方案吗
谢谢
您可以捕获并忽略异常,或者调整安全设置以允许跨域脚本:
- 从 WebBrowser 导出 class
- create a nested class derived from WebBrowser.WebBrowserSite(您可以从嵌套 class 派生的唯一方法)
- 覆盖 CreateWebBrowserSiteBase 和 return 您的网络浏览器站点的新实例。
- 在网络浏览器站点上实施 IServiceProvider
- 实现 IServiceProvider.QueryService,因此在请求 SID_SInternetHostSecurityManager 服务时,它 return 是一个 IInternetHostSecurityManager 实现
- 处理 IInternetHostSecurityManager.GetSecurityId 和 return 您希望跨域脚本处理的所有站点的相同域 ID。对于其他网站,给每个域一个不同的 ID。请注意,这会使您的应用程序受到跨域脚本攻击,因此您需要信任共享同一 ID 的所有域。
- 在表单中使用新的网络浏览器