2012年4月2日 星期一

[VB.NET]加入HTTPS的服務參考遇到的問題

呼叫公司的驗證帳密WebService時遇到的問題
花了我一天的時間才解決,在這邊記錄一下,免得以後忘記。

主題:呼叫https開頭的WebService時,必需要做的三件事。

前言:
原本我以為,加入一個「服務參考」是一件再簡單不過的事情了
以網站為例,只要在方案總管裡,對著Root的項目按右邊,接著選「加入服務參考...」
再來只要把你的WebService路徑(EX:https://192.168.0.11/Service.asmx)輸入到路徑,按下搜尋
或是確定,基本上就沒有問題了

但這一次,算是遇到了不少問題,以下一一道來…

(1). 無法辨認的屬性 'decompressionEnabled'。請注意,屬性名稱必須區分大小寫。 (~\web.config line 182)
解決方法:到Web.Config裡,移除掉圖一的[1]所示的屬性即可。

(2). 無法載入合約 'Service.WSWEBSoap' 的端點組態區段,因為找到多個該合約的端點組態。請以名稱指示偏好的端點組態區段。
 解決方法:到Web.Config裡,移除掉圖一的[2]所示的整段節點即可。

(3). 無法利用授權 'xxx.xxx.xxx.xxx' 為 SSL/TLS 安全通道建立信任關係。
解決方法:問題的原因可以參考這裡,大意是說無法建立這個服務的授權,所以乾脆自己創造一個授權,但前提是你必需要確定,你呼叫的Service是可信任的。 這個問題花了比較多的時間找VB.NET的Solution,C#倒是滿好找的= =",所以這邊就把兩個找到的方式就列出來,因為我的專案是用vb開發的,所以c#就留待以後再測試囉。

VB.NET
1.先引用必要的類別庫:
Imports System.Net
Imports System.Security.Cryptography.X509Certificates
Imports System.Net.Security

2.自己定義一個驗證服務的副程式。
    Private Function ValidateCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
        'Return True to force the certificate to be accepted.
        Return True
    End Function

3.在FormLoad或是PageLoad的時間點呼叫[2]所定義的副程式,這個部分的呼叫方式,在C#那邊可能比較好理解,就是委派一個新的副程式來取代原有的驗證方法。
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)
--完成--

C#.NET
1.先引用必要的類別庫:
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

2.自己定義一個驗證服務的副程式。
    private static bool RemoteCertificateValidate(object sender, X509Certificate cert,X509Chain chain, SslPolicyErrors error)
    {
        // trust any certificate!!!
        System.Console.WriteLine("Warning, trust any certificate");
        return true;
    }


3.只要在你要呼叫WebService的方法前加上這一段就行了,可在FormLoad或是PageLoad的時間點呼叫[2]所定義的副程式,這個部分的呼叫方式,在C#那邊可能比較好理解,就是委派一個新的副程式來取代原有的驗證方法。
ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
--完成--
圖一、問題1&2修改註記。

沒有留言:

張貼留言