C#拡張WebBrowserによるネットワーク接続エラー情報の取得

12150 ワード

WebBrowserが指定されたWebサイトに接続中に発生したエラー情報をキャプチャしたい.ネットワークが接続できない、404ページが見つからないなどのエラーが含まれます.ネット上で収集した結果、Webサイトに接続する前に余分なテストリクエストを発行しないソリューションが見つかりました.
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イベントを使用するように拡張するなど、このような考え方で拡張を続けることもできます.