【问题标题】:WebBrowser.Document property getter throws UnauthorizedAccessExceptionWebBrowser.Document 属性获取器抛出 UnauthorizedAccessException
【发布时间】:2013-06-04 08:50:58
【问题描述】:

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

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

旁注:使用 webBrowser.ScriptErrorsSuppressed = true; 的最佳答案方法实际上抑制了我们不想做的 all 弹出窗口,因此我们采用了附加错误事件处理程序的第二种答案方法:

    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: 

所以错误是从IHTMLLocation.GetHref() 中引发的。我们花了一些时间调查调用时有效的 WebPermission(s),然后才意识到 .Net 自己的安全模型没有抛出此错误 - 它源自底层 IE 浏览器控件。

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

==== 更新 ====

这显然是由跨 frame 脚本安全性引起的。我无法通过顶部发布的代码解决这个问题,但是对于原始问题(抑制脚本错误)有一个替代解决方案,请参阅Override IOleCommandTarget to suppress script errors

【问题讨论】:

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

标签: .net internet-explorer webbrowser-control shdocvw axwebbrowser


【解决方案1】:

如果您只想抑制脚本错误,请处理 OLECMDID_SHOWSCRIPTERROR from the CGID_DocHostCommandHandler command group in your host's IOleCommandTarget implementation。要在 Windows 窗体的 WebBrowser 类中处理此问题,您需要自己的实现 IOleCommandTargetWebBrowserSite 类并将其用作 Web 浏览器的控制站点。如果您直接托管 ActiveX 版本的 IE,请查看https://code.google.com/p/csexwb2/

注意实现 IOleCommandTarget 将有 webbrowser 控件routing all kinds of commands(例如 OLECMDID_PRINT、OLECMDID_SHOWPAGEACTIONMENU、OLECMDID_PASTESPECIAL、OLECMDID_SETPROGRESSPOS 等)到主机。如果您对更改这些命令的默认行为不感兴趣,请记住返回 OLECMDERR_E_NOTSUPPORTED(如果您处理组而不是命令)或 OLECMDERR_E_UNKNOWNGROUP,否则您的应用程序可能会崩溃。

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多