WebBrowser控件打開https站點


於需要重定向https類型網站,但自己的https證書是自簽名的,總是提示‘網站的安全證書存在問題’。

鑒此,查了些許資料,然而許多方法對我並沒有什么卵用,不過以后還是可用用上的,故整理下【當然其中也有一些有效的方法】

首先,自己使用的是WPF中的WebBrowser

1、設置ServicePointmanager的驗證回調,然而,這方法只能用於httprequest等托管代碼中,webbrowser實現並不適用。代碼如下:

1
2
3
4
5
6
ServicePointManager.ServerCertificateValidationCallback = new  RemoteCertificateValidationCallback(ValidateServerCertificate);
 
public  static  bool  ValidateServerCertificate( object  sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
     return  true ;
}

2、在1無效的情況下,又有些朋友說要設置ScriptErrorsSuppressed屬性為true,然而wpf中的webbrowser並沒有此屬性,故有以下方法添加相似設置。【注意:此方法應該是正對腳本執行的】

  • 方法一:【 SetSilent方法調用據說要放在webbrowser的Navigated的事件中】
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public  static  void  SetSilent(WebBrowser browser, bool  silent)
            {
                FieldInfo fiComWebBrowser = typeof (WebBrowser).GetField( "_axIWebBrowser2" , BindingFlags.Instance | BindingFlags.NonPublic);
                if  (fiComWebBrowser == null )
                    return ;
                object  objComWebBrowser = fiComWebBrowser.GetValue(browser);
                if  (objComWebBrowser == null )
                    return ;
                objComWebBrowser.GetType().InvokeMember( "Silent" , BindingFlags.SetProperty, null , objComWebBrowser, new  object [] { silent });
            }
     
     
     
    SetSilent(sender as  WebBrowser, true );
  • 方法二:【 SetSilent方法調用據說要放在webbrowser的Navigated的事件中】
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
             public  static  void  SetSilent(WebBrowser browser, bool  silent)
             {
                 if  (browser == null )
                     throw  new  ArgumentNullException( "browser" );
     
                 // get an IWebBrowser2 from the document
                 IOleServiceProvider sp = browser.Document as  IOleServiceProvider;
                 if  (sp != null )
                 {
                     Guid IID_IWebBrowserApp = new  Guid( "0002DF05-0000-0000-C000-000000000046" );
                     Guid IID_IWebBrowser2 = new  Guid( "D30C1661-CDAF-11d0-8A3E-00C04FC9E26E" );
     
                     object  webBrowser;
                     sp.QueryService( ref  IID_IWebBrowserApp, ref  IID_IWebBrowser2, out  webBrowser);
                     if  (webBrowser != null )
                     {
                         webBrowser.GetType().InvokeMember( "Silent" , BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null , webBrowser, new  object [] { silent });
                     }
                 }
             }
     
     
             [ComImport, Guid( "6D5140C1-7436-11CE-8034-00AA006009FA" ), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
             private  interface  IOleServiceProvider
             {
                 [PreserveSig]
                 int  QueryService([In] ref  Guid guidService, [In] ref  Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out  object  ppvObject);
             }
     
     
     
     
    SetSilent(sender as  WebBrowser, true );
  • 方法三:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    WebBrowser t = sender as  WebBrowser;
     
    dynamic activeX = t.GetType().InvokeMember(
         "ActiveXInstance" ,
         BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
         null ,
         t,
         new  object [] { });
    activeX.Silent = true ;

 

然而wpf設置了好像沒啥用,轉而使用winform試試,直接就可以設置ScriptErrorsSuppressed,不過問題來了,設置為true之后,不彈窗了,但我想點的是彈窗的‘是(Y)’啊,設置之后直接就相當於選‘否(N)’了。

不過,網上還有人說要用AxWebBrowser,我也就加了個com試試,不同的是其中設置的是Silent屬性,效果和winform基本一樣。。。

【注:】wpf與winform中的webbrowser還有一點不一樣,wpf用的ie版本好像比較高,https證書不對時直接在頁面內顯示,而winform中ie版本應該比較低,https證書不對時直接彈窗。

下面就是有效的方法啦:

1、用winform中的webbrowser,自動點擊‘是’【使用window api】

1
2
3
4
5
6
7
8
9
10
[DllImport( "user32.dll" )]
public  extern  static  int  FindWindow( string  lpclassname, string  lpwindowname);
 
[DllImport( "user32.dll" )]
public  extern  static  void  SetForegroundWindow( int  handle);
 
 
     int  iHandle = FindWindow( null , "安全警報" );
     SetForegroundWindow(iHandle);
     System.Windows.Forms.SendKeys.SendWait( "Y%" );

2、最后一種是自己解決遇到的問題的方法:

使用wpf中的webbrowser,在webbrowser的Navigating事件中,判斷當前的uri,自動換為非http的uri

1
(sender as  WebBrowser).Navigate(http: //www.xxx.com);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM