我们有一个Windows窗体应用程序,它在WebBrowser控件中托管来自http://localhost
(在运行时选择的端口上)的Web应用程序,该应用程序大部分工作正常。在webapp中有一个弹出一个新窗口的“帮助”链接,我们通过监听NewWindow事件并在另一个窗体/窗口中的另一个WebBrowser控件中显示帮助URL来处理这个问题,这也很好。
问题是html帮助文件正在生成脚本错误,这会导致恼人的弹出错误消息。从浏览器中查看(通过IE,Chrome和Firefox确认)时,开发工具会显示脚本错误,但浏览器会默认禁止它们(没有恼人的弹出窗口)。因此,为了在使用WebBrowser控件时抑制错误,我们遵循了“Disable JavaScript error in WebBrowser control”
的方法旁注:使用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:
因此错误已从IHTMLLocation.GetHref()
内提出。我们花了一些时间调查在调用时生效的WebPermission,然后才意识到这个错误已经<。> 没有被.Net自己的安全模型抛出 - 它来自底层的IE浏览器控件。
我们的webapp中的所有URL(包括帮助文件)都位于localhost上,因此实际上不会出现此错误,即我们不希望触发跨站点脚本攻击保护。
====更新====
这显然是由跨 frame 脚本安全性引起的。我无法通过顶部发布的代码克服此问题,但是有一个替代原始问题的解决方案(抑制脚本错误),请参阅Override IOleCommandTarget to suppress script errors
答案 0 :(得分:1)
如果您只想抑制脚本错误,请处理OLECMDID_SHOWSCRIPTERROR from the CGID_DocHostCommandHandler command group in your host's IOleCommandTarget implementation。要在Windows窗体的WebBrowser类中处理此问题,您需要自己的WebBrowserSite类来实现IOleCommandTarget并将其用作webbrowser的控制站点。如果您直接托管IE的ActiveX版本,请选中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,否则您的应用程序可能会崩溃。