C# 通过扩展WebBrowser捕获网络连接错误信息

文章介绍了如何通过扩展C#的WebBrowser控件来捕获和处理NavigateError事件,从而获取网络连接错误信息,如404错误等。通过创建自定义事件和事件处理助手类,可以在连接错误时触发事件并执行相应操作,例如转向本地页面。这种方法不会在网站加载前产生额外的请求,且不影响控件原有功能。
摘要由CSDN通过智能技术生成

C# 通过扩展WebBrowser捕获网络连接错误信息
想捕获WebBrowser连接指定网站过程中发生的错误信息,包括网络无法连接、404找不到网页等等错误!经过网上的搜集,找到了以下解决方案,该解决方案不会在网站连接前发出多余的测试请求。
向Webbrowser中注册NavigateError事件,以扩展webbrowser:

[ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
TypeLibType(TypeLibTypeFlags.FHidden)]
public interface DWebBrowserEvents2
{
    [DispId(271)]
    void NavigateError(
        [In, MarshalAs(UnmanagedType.IDispatch)] object pDisp,
        [In] ref object URL, [In] ref object frame,
        [In] ref object statusCode, [In, Out] ref bool cancel);
}

自定义NavigateError事件的参数:

using System;
using System.Runtime.InteropServices;
public class WebBrowserNavigateErrorEventArgs : EventArgs
{
    private String urlValue;
    private String frameValue;
    private Int32 statusCodeValue;
    private Boolean cancelValue;
    public WebBrowserNavigateErrorEventArgs(
        String url, String frame, Int32 statusCode, Boolean cancel)
    {
        urlValue = url;
        frameValue = frame;
        statusCodeValue = statusCode;
        cancelValue = cancel;
    }
    public String Url
    {
        get { return urlValue; }
        set { urlValue = value; }
    }
    public String Frame
    {
        get { return frameValue; }
        set { frameValue = value; }
    }
    public Int32 StatusCode
    {
        get { return statusCodeValue; }
        set { statusCodeValue = value; }
    }
    public Boolean Cancel
    {
        get { return cancelValue; }
        set { cancelValue = value; }
    }
}

扩展webbrowser为MyWebBrowser,在程序中将webbrowser改成Mywebbrowser即可:

using System.Windows.Forms;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System;
public class MyWebBrowser : WebBrowser
{
    AxHost.ConnectionPointCookie cookie;
    MyWebBrowserEventHelper helper;
    public delegate void WebBrowserNavigateErrorEventHandler(object sender,
        WebBrowserNavigateErrorEventArgs e);

    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    protected override void CreateSink()
    {
        base.CreateSink();
        // Create an instance of the client that will handle the event
        // and associate it with the underlying ActiveX control.
        helper = new MyWebBrowserEventHelper(this);
        cookie = new AxHost.ConnectionPointCookie(
            this.ActiveXInstance, helper, typeof(DWebBrowserEvents2));
    }
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    protected override void DetachSink()
    {
        // Disconnect the client that handles the event
        // from the underlying ActiveX control.
        if (cookie != null)
        {
            cookie.Disconnect();
            cookie = null;
        }
        base.DetachSink();
    }
    public event WebBrowserNavigateErrorEventHandler NavigateError;
    // Raises the NavigateError event.
    protected virtual void OnNavigateError(
        WebBrowserNavigateErrorEventArgs e)
    {
        if (this.NavigateError != null)
        {
            this.NavigateError(this, e);
        }
    }
    // Handles the NavigateError event from the underlying ActiveX 
    // control by raising the NavigateError event defined in this class.
    private class MyWebBrowserEventHelper :
        StandardOleMarshalObject, DWebBrowserEvents2
    {
        private MyWebBrowser parent;
        public MyWebBrowserEventHelper(MyWebBrowser parent)
        {
            this.parent = parent;
        }
        public void NavigateError(object pDisp, ref object url,
            ref object frame, ref object statusCode, ref bool cancel)
        {
            // Raise the NavigateError event.
            this.parent.OnNavigateError(
                new WebBrowserNavigateErrorEventArgs(
                (String)url, (String)frame, (Int32)statusCode, cancel));
        }
    }
}

将以上代码完全复制粘贴到您的程序当中,然后将您原本程序中使用webbrowser的地方修改成MyWebBrowser就行了。这个时候你的mywebbrowser控件就有了onnavigateerror事件,在这个事件里编写您的错误处理方法。您或许需要用到错误消息中的错误代码,具体错误代码请参照里的每个错误代码代表的意义。
本人项目中所使用的错误处理代码如下:

 private void WebBrowserIE_NavigateError(object sender, WebBrowserNavigateErrorEventArgs e)
        {
            log.Debug("ERROR:----------" + e.Url);
            int code = e.StatusCode;
            // 发生错误时,转向本地页面
            if (code == -2146697211)
            {                WebBrowserIE.Navigate("本地页面");
            }
        }

这个扩展方法完全不会影响webbrowser原有的任何功能,当然,您还可以按照这种思路继续进行扩展,比如扩展使其用有mousemove事件,也是可以的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值