.net WebBrowser.Document属性getter引发UnauthorizedAccessException

.net WebBrowser.Document属性getter引发UnauthorizedAccessException,.net,internet-explorer,webbrowser-control,shdocvw,axwebbrowser,.net,Internet Explorer,Webbrowser Control,Shdocvw,Axwebbrowser,我们有一个Windows窗体应用程序,它从http://localhost(在运行时选择的端口上)在WebBrowser控件中,该控件大部分工作正常。在webapp中有一个弹出新窗口的“帮助”链接,我们通过监听NewWindow事件并在另一个表单/窗口中的另一个WebBrowser控件中显示帮助URL来处理这个问题,这通常也可以正常工作 问题是html帮助文件正在生成脚本错误,这会导致恼人的弹出错误消息。从浏览器中查看时(使用IE、Chrome和Firefox确认),开发工具会显示发生的脚本错误

我们有一个Windows窗体应用程序,它从
http://localhost
(在运行时选择的端口上)在WebBrowser控件中,该控件大部分工作正常。在webapp中有一个弹出新窗口的“帮助”链接,我们通过监听NewWindow事件并在另一个表单/窗口中的另一个WebBrowser控件中显示帮助URL来处理这个问题,这通常也可以正常工作

问题是html帮助文件正在生成脚本错误,这会导致恼人的弹出错误消息。从浏览器中查看时(使用IE、Chrome和Firefox确认),开发工具会显示发生的脚本错误,但默认情况下浏览器会抑制这些错误(没有恼人的弹出窗口)。因此,为了在使用WebBrowser控件时抑制错误,我们采用了来自“”的方法

旁注:使用webBrowser.ScriptErrorsSuppressed的顶部答案方法=true;实际上会抑制所有我们不希望出现的弹出窗口,因此我们采用了第二种方法,即附加一个错误事件处理程序:

    void FooWebBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        SuppressErrorDialogs(sender);
    }

    void FooWebBrowser_FileDownload(object sender, EventArgs e)
    {
        SuppressErrorDialogs(sender);
    }

    private void SuppressErrorDialogs(object sender)
    {
        WebBrowser webBrowser = sender as WebBrowser;
        if(null == webBrowser) {
            return;
        }

        HtmlDocument document = webBrowser.Document;
        if(null == document) {
            return;
        }

        HtmlWindow window = document.Window;
        if(null == window) {
            return;
        }

        window.Error += (o, args) => args.Handled = true;
    }
SuppressErrorDialogs中的.Document属性getter失败,如下所示:

System.UnauthorizedAccessException was unhandled by user code
  Message=Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
  Source=System.Windows.Forms
  StackTrace:
       at System.Windows.Forms.UnsafeNativeMethods.IHTMLLocation.GetHref()
       at System.Windows.Forms.WebBrowser.get_Document()
       at FSG.Process.Offline.FocusWebBrowser.SuppressErrorDialogs(Object sender) in C:\CoreFocus360\Technology\Process\Main\Assemblies\FSG.Process.Offline\FocusWebBrowser.cs:line 55
       at FSG.Process.Offline.FocusWebBrowser.FocusWebBrowser_Navigated(Object sender, WebBrowserNavigatedEventArgs e) in C:\CoreFocus360\Technology\Process\Main\Assemblies\FSG.Process.Offline\FocusWebBrowser.cs:line 40
       at System.Windows.Forms.WebBrowser.OnNavigated(WebBrowserNavigatedEventArgs e)
       at System.Windows.Forms.WebBrowser.WebBrowserEvent.NavigateComplete2(Object pDisp, Object& urlObject)
  InnerException: 
因此,该错误是从
ihtmlocation.GetHref()
中引发的。我们花了一些时间调查了调用时生效的WebPermission,然后才意识到此错误不是由.Net自身的安全模型引发的-它源自底层IE浏览器控件

我们的webapp中的所有URL(包括帮助文件)都位于localhost上,因此此错误确实不是预期的,即我们不希望触发跨站点脚本攻击保护

==更新====


这显然是由跨帧脚本安全性引起的。我无法用上面的代码解决这个问题,但是有一个解决原始问题的替代方案(抑制脚本错误),请参见

如果您只想抑制脚本错误,请处理。要在Windows窗体的WebBrowser类中处理此问题,您需要自己的类来实现并将其用作WebBrowser的控制站点。如果您直接托管IE的ActiveX版本,请选中


注意:实现IOleCommandTarget将向主机提供webbrowser控件(例如,OLECMDID_打印、OLECMDID_显示页面操作菜单、OLECMDID_粘贴专用、OLECMDID_设置进度POS等)。如果您对更改这些命令的默认行为不感兴趣,请记住返回OLECMDERR_E_NOTSUPPORTED(如果您处理的是组而不是命令)或OLECMDERR_E_UNKNOWNGROUP,否则您的应用程序可能会崩溃。

如果未启用跨帧脚本(默认情况下禁用),当页面包含您无权访问的帧时,会出现此异常。