根据 this article ,我扩展了 System.Windows.Forms.WebBrowser 类来实现自定义错误处理。大多数情况下,它有效。
当浏览器收到“401 Unauthorized”响应时,问题就来了。这种响应会导致 WebBrowser 控件显示标准的用户名/密码对话框。 NavigateError 事件在该对话框被取消之前不会被触发。
那么我可以做些什么来捕获 401 响应并以我自己的自定义方式处理它呢?
我假设我可以做一些事情,例如我为捕获 NavigateError 事件所做的事情,并以我自己的方式处理这些事件,但我还没有看到任何东西。
编辑:找到解决方案!
重要的步骤是:
1. WebBrowser 控件必须首先导航到非安全页面(“about:blank”是使用的典型 URL)以避免 KB 320153
2. WebBrowser 控件的宿主必须实现IOleClientSite、IServiceProvider 和IAuthenticate。
3. IServiceProvider.QueryService 必须使用 IAuthenticate 实现处理 IAuthenticate 服务请求,所有其他服务请求都可以使用 INET_E_DEFAULT_ACTION 处理 响应。
4. IAuthenticate.Authenticate 是您的自定义身份验证处理程序。
请您参考如下方法:
implement IAuthenticate and IAuthenticateEx on your webbrowser host .基本上,您的 IOleClientSite 实现需要响应 IServiceProvider.QueryService,并在服务为 IID_IAuthenticate 时返回 IAuthenticate(Ex) 接口(interface)(不是托管接口(interface),是从 Marshal.GetComInterfaceForObject 返回的 native 接口(interface))。对于无法识别的服务请求,QueryService 应该返回 INET_E_DEFAULT_ACTION。
我不认为 WPF webbrowser 有其 IOleClientSite 实现的扩展点。您可以尝试托管一个 Winform webbrowser 类,该类具有覆盖的 CreateWebBrowserSiteBase 虚拟方法,该方法提供 IAuthenticate(Ex) 实现,或 write a webbrowser wrapper from the ground up .
