http://localhost
我们有一个 Windows 窗体应用程序,它在 WebBrowser 控件中(在运行时选择的端口上)托管 Web 应用程序,该控件大部分工作正常。在 webapp 中有一个“帮助”链接,它会弹出一个新窗口,我们通过监听 NewWindow 事件并在另一个窗体/窗口中的另一个 WebBrowser 控件中显示帮助 URL 来处理这个问题,这通常也可以正常工作。
问题是 html 帮助文件正在生成脚本错误,这会导致烦人的弹出错误消息。从浏览器中查看时(通过 IE、Chrome 和 Firefox 确认),开发工具会显示发生的脚本错误,但默认情况下浏览器会抑制它们(没有烦人的弹出窗口)。因此,为了在使用 WebBrowser 控件时抑制错误,我们采用了“禁用 WebBrowser 控件中的 JavaScript 错误”中的方法
旁注:使用 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 属性获取器失败如下:
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 上,所以这个错误真的不是预期的,即我们不希望触发跨站点脚本攻击保护。
==== 更新 ====
这显然是由跨框架脚本安全性引起的。我无法通过顶部发布的代码来解决这个问题,但是对于原始问题有一个替代解决方案(抑制脚本错误),请参阅覆盖 IOleCommandTarget 以抑制脚本错误