C# 如何在System.Windows.Forms.WebBrowser中确定加载的页面是错误页面还是有效页面?

C# 如何在System.Windows.Forms.WebBrowser中确定加载的页面是错误页面还是有效页面?,c#,.net,winforms,C#,.net,Winforms,我正在使用 System.Windows.Forms.WebBrowser 控件,用于显示某些页面。当用户单击不存在的页面的url时,我想做一些自定义工作 基本上,我想在浏览器显示以下消息时设置一些值 The page cannot be displayed The page you are looking for is currently unavailable. The Web site might be experiencing technical difficulties 如何

我正在使用

System.Windows.Forms.WebBrowser
控件,用于显示某些页面。当用户单击不存在的页面的url时,我想做一些自定义工作

基本上,我想在浏览器显示以下消息时设置一些值

The page cannot be displayed 
 The page you are looking for is currently unavailable. The Web site might be experiencing technical difficulties 

如何获取状态以便区分加载的页面和错误页面?

您可以使用
WebBrowser
控件上的
CreateSink
方法访问底层WebBrowser ActiveX控件的
NavigateError
事件。
System.Windows.Forms.WebBrowser
控件是WebBrowser ActiveX控件的托管包装器,但它并不包装该ActiveX控件的所有功能。
NavigateError
事件在非托管ActiveX web浏览器控件上可用
CreateSink
将允许您扩展
System.Windows.Forms.WebBrowser
控件的功能,以便处理
NavigateError
事件

从文件中:

如果您熟悉使用 非托管WebBrowser ActiveX控件,您希望扩展 Windows窗体WebBrowser控件的功能,它是 ActiveX控件的托管包装器。你可以用这个 可扩展性,以实现ActiveX控件中的事件 包装器控件未提供

MSDN在这里有一个完整的例子:

如果将WebBrowser强制转换为底层ActiveX实现,则可以访问NavigateError事件

注意:您需要添加对SHDocVw的引用。令人困惑的是,它位于COM选项卡中,名称为“Microsoft Internet控件”,路径为c:\windows\system32\ieframe.dll

 private void button1_Click(object sender, EventArgs e)
        {
            //Note: you need to wait until the ActiveXInstance property is initialised.
            var axWebBrowser = (SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
            axWebBrowser.NavigateError += axWebBrowser_NavigateError; 
            webBrowser1.Url = new Uri("http://www.thisisnotavaliddomain.com");
        }

        void axWebBrowser_NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
        {
            //handle your error
        }

这真的不管用。许多ISP只会重定向到某种广告垃圾页面。您需要一个声誉良好的DNS服务器,如8.8.8.8。这对我来说很有效,为我节省了webrowser类的过度扩展。我没有尝试过这一点,另一个答案为我节省了扩展类的实现。很高兴您能够使这项工作正常。我认为我的方法可以避免您添加对SHDocVw的引用,但我的方法肯定比其他答案更复杂。我不是专业人士,但在客户端部署时引用此程序集会导致任何问题或其他问题吗?@CodeMe我不确定,但是我不认为引用程序集会引起问题,因为最终我认为dll需要存在于客户端计算机上。我会使用更简单的解决方案,如果您在部署方面遇到问题,那么使用我的方法创建一个测试项目,看看是否能够解决这些问题。