wcf學習總結《中》

科技小先鋒發表於2017-11-08

  上次我們結合著專案分析講解了wcf概述、服務端契約、服務端宿主、服務端配置,這次我們接著講解(以程式設計方式實現)客戶端配置、數字證書來講解分析。

客戶端配置

我們可以通過新增服務引用來建立客戶端應用程式。除了新增引用之外,還可以直接訪問包含契約介面的程式集。前面我們不是說了客戶端在使用服務時,需要首先建立一個代理服務,然後呼叫這個代理服務。客戶呼叫代理上的一個方法。代理提供了服務定義的方法,但把方法呼叫轉換為一條訊息,並把該訊息傳輸到通道上。通道有一個客戶端和一個服務端,它們通過一個網路協議來通訊。在通道上,把訊息傳遞給排程程式,排程程式再把訊息轉換為服務呼叫的方法呼叫。所以我們使用ChannelFactory<TChannel>類例項化連線到服務的通道。ChannelFactory<TChannel>類的建構函式接受繫結配置和端點地址這兩個引數。繫結引數必須與用服務主機建立的相容,用EndpointAddress類定義的地址引用所執行的服務的URI

CreateChannel()方法建立一條連線到服務的通道。接著呼叫服務的方法,可以看出。該服務例項包含狀態,直接呼叫指定了IsTerminating操作行為的Close()方法為止。我們IIS專案中以程式設計方式建立的客戶端如下圖所示:

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
34
35
36
37
38
39
40
41
42
43
44
45
public static object ExecuteMetod<T>(string uri, string methodName, params object[] args)
        {
            //實現WCF密文驗證;;
            SystemConfigService sysConfigService = new SystemConfigService();
            SystemConfig systemConfig = sysConfigService.GetOneSystemConfig("WCF""WCFSecurityCount");
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(systemConfig.ParameterValue);
            XmlNode xmlNode = xmlDocument.SelectSingleNode("WCF");
            string WcfUserName = xmlNode.Attributes["WCFUserName"].Value;
            string WcfPsw = xmlNode.Attributes["WCFPsw"].Value;
            WSHttpBinding bind = new WSHttpBinding();
            bind.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
            //實際上 Indentity應該是 對應的cert名稱,這裡WCFTest只是測試Cert名稱
            EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("IISCompanionWCFCert");
            Uri u = new Uri(uri);
            EndpointAddress endpoint = new EndpointAddress(u, identity);
            ChannelFactory<T> cf = new ChannelFactory<T>(bind, endpoint);
            cf.Credentials.UserName.UserName = WcfUserName;
            cf.Credentials.UserName.Password = WcfPsw;
            T instance = cf.CreateChannel();
            using (instance as IDisposable)
            {
                try
                {
                    Type type = typeof(T);
                    MethodInfo mi = type.GetMethod(methodName);
                    return mi.Invoke(instance, args);
                }
                catch (TimeoutException)
                {
                    (instance as ICommunicationObject).Abort();
                    throw;
                }
                catch (CommunicationException)
                {
                    (instance as ICommunicationObject).Abort();
                    throw;
                }
                catch (Exception)
                {
                    (instance as ICommunicationObject).Abort();
                    throw;
                }
            }
        }


數字證書

為了保證客戶端與服務端通訊時資訊不被竊聽篡改,我們iis專案運用了數字證書的安全設定方式,什麼是數字證書呢?

據百度百科講解:數字證書是一個經證書授權中心數字簽名的包含公開金鑰擁有者資訊以及公開金鑰的檔案。最簡單的證書包含一個公開金鑰、名稱以及證書授權中心的數字簽名。數字證書是一種權威性的電子文件,由權威公正的第三方機構,即CA(例如GlobalSign,江蘇CA)中心簽發的證書。它以數字證書為核心的加密技術(加密傳輸、數字簽名、數字信封等安全技術)可以對網路上傳輸的資訊進行加密和解密、數字簽名和簽名驗證,確保網上傳遞資訊的機密性、完整性及交易的不可抵賴性。使用了數字證書,即使您傳送的資訊在網上被他人截獲,甚至您丟失了個人的賬戶、密碼等資訊,仍可以保證您的賬戶、資金安全。

怎樣建立我們專案中一樣的數字證書呢?主要分為四步如下:

1.將共享盤裡SoftwaresWeb組共享》wcf資料夾裡的IISCompanionWCFCert.pfx(數字證書)拷貝到桌面;

2.在開始裡輸入mmc, 會開啟控制檯,然後點選“檔案”選擇“新增/刪除管理單元”;

3.將列表中的選擇“證書”,然後“新增”,然後“確定”,然後選擇“計算機賬戶”,“下一步”,“本地計算機”;

4.點選“證書(本地計算機)”,然後點選“受信任的根證書頒發機構”,右鍵“證書”,然後“所有任務”,然後“匯入”,“下一步”,“瀏覽”,型別選擇“個人資訊交換”選擇拷貝到桌面的IISCompanionWCFCert.pfx(數字證書);密碼為:wcf資料夾裡的“說明.txt”裡的密碼。

總結

對於我們iis專案裡的wcf安裝經常遇到一些莫名其妙的問題,但總結了下但部分都是這幾類問題:

WCF配置檔案中的端點ip地址錯(IISWindowsService.exe.config);

證書建立不正確;

w3svc服務未安裝

防火牆未關閉;

由於每個人的電腦環境不一樣所以安裝時經常會遇到莫名錯誤,此時一定要細心耐心查詢,一定能找到解決辦法的,謝謝觀看我的部落格!



本文轉自HDDevTeam 51CTO部落格,原文連結:http://blog.51cto.com/hddev/1218455,如需轉載請自行聯絡原作者