3

Web サイトのスクリーンショットをリモートでキャプチャできるコンソール アプリケーションを作成しています。証明書エラーを回避できないという事実を除いて、すべてが機能しています。通過できないというポップアップメッセージが表示されるたびに。

私は使用してみました:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

しかし、うまくいきません。ここにある解決策も試してみました: http://www.codeproject.com/Articles/31163/Suppressing-Hosted-WebBrowser-Control-Dialogs しかし、コンソール アプリケーションから呼び出された Web ブラウザーでは機能しないようです。

何か案は?

4

2 に答える 2

3

やっと思いついた。

コンソール アプリ ( http://triflejs.org )として実行されているヘッドレス IE ブラウザーの SSL 証明書エラーを回避しようとしています。

ShengJiangApplication.Run()は答えの大部分を提供しましたが、メイン スレッドでの実行がロックされ、ループ内で他のイベントを実行する必要があったため、まだ使用できませんでしApplicationContextた。

私がそれを得たときの答えは非常に簡単でした。ループを作成して実行するだけですApplication.DoEvents()

ここにいくつかの作業コードがあります。ここに投稿された質問に合わせて単純化しました。

次のことを確認してください。

  1. コンソール アプリケーションプロジェクトとして実行しています。
  2. へのプロジェクト参照を追加しSystem.Windows.Formsます。

それが役に立てば幸い!

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace IgnoreSSLErrorBrowserConsoleApp
{
    public class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            MyWebBrowser browser = new MyWebBrowser();
            browser.Navigate("about:blank");
            browser.DocumentCompleted += delegate (object obj, WebBrowserDocumentCompletedEventArgs e) {
                if (e.Url.ToString() == "about:blank") {
                    // This is the SSL path where certificate error occurs
                    browser.Navigate("https://localhost");
                }
            };
            while (browser.ReadyState != WebBrowserReadyState.Complete) {
                Application.DoEvents();
                // RunOtherEvents();
            }

        }
    }

    [Guid("6D5140C1-7436-11CE-8034-00AA006009FA")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface UCOMIServiceProvider
    {
        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int QueryService(
            [In] ref Guid guidService,
            [In] ref Guid riid,
            [Out] out IntPtr ppvObject);
    }
    [ComImport()]
    [ComVisible(true)]
    [Guid("79eac9d5-bafa-11ce-8c82-00aa004ba90b")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IWindowForBindingUI
    {
        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int GetWindow(
            [In] ref Guid rguidReason,
            [In, Out] ref IntPtr phwnd);
    }

    [ComImport()]
    [ComVisible(true)]
    [Guid("79eac9d7-bafa-11ce-8c82-00aa004ba90b")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IHttpSecurity
    {
        //derived from IWindowForBindingUI
        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int GetWindow(
            [In] ref Guid rguidReason,
            [In, Out] ref IntPtr phwnd);
        [PreserveSig]
        int OnSecurityProblem(
            [In, MarshalAs(UnmanagedType.U4)] uint dwProblem);
    }
    public class MyWebBrowser : WebBrowser
    {
        public static Guid IID_IHttpSecurity
            = new Guid("79eac9d7-bafa-11ce-8c82-00aa004ba90b");
        public static Guid IID_IWindowForBindingUI
            = new Guid("79eac9d5-bafa-11ce-8c82-00aa004ba90b");
        public const int S_OK = 0;
        public const int S_FALSE = 1;
        public const int E_NOINTERFACE = unchecked((int)0x80004002);
        public const int RPC_E_RETRY = unchecked((int)0x80010109);
        protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
        {
            return new MyWebBrowserSite(this);
        }
        class MyWebBrowserSite : WebBrowserSite,
            UCOMIServiceProvider,
            IHttpSecurity,
            IWindowForBindingUI
        {
            private MyWebBrowser myWebBrowser;
            public MyWebBrowserSite(MyWebBrowser myWebBrowser)
                : base(myWebBrowser)
            {
                this.myWebBrowser = myWebBrowser;
            }
            public int QueryService(ref Guid guidService
                , ref Guid riid
                , out IntPtr ppvObject)
            {
                if (riid == IID_IHttpSecurity)
                {
                    ppvObject = Marshal.GetComInterfaceForObject(this
                        , typeof(IHttpSecurity));
                    return S_OK;
                }
                if (riid == IID_IWindowForBindingUI)
                {
                    ppvObject = Marshal.GetComInterfaceForObject(this
                        , typeof(IWindowForBindingUI));
                    return S_OK;
                }
                ppvObject = IntPtr.Zero;
                return E_NOINTERFACE;
            }

            public int GetWindow(ref Guid rguidReason
                , ref IntPtr phwnd)
            {
                if (rguidReason == IID_IHttpSecurity
                    || rguidReason == IID_IWindowForBindingUI)
                {
                    phwnd = myWebBrowser.Handle;
                    return S_OK;
                }
                else
                {
                    phwnd = IntPtr.Zero;
                    return S_FALSE;
                }
            }

            public int OnSecurityProblem(uint dwProblem)
            {
                //ignore errors
                //undocumented return code, does not work on IE6
                return S_OK;
            }
        }
    }
}
于 2014-01-08T23:09:19.137 に答える