|
上一節《WCF分布式框架基礎概念》我們介紹了WCF服務的概念和通信框架模型,并給出了基于自定義托管服務的WCF程序的實現代碼??紤]到WCF分布式開發項目中關于托管宿主服務配置和客戶端添加引用。兩個環節最容易出錯。對于大部分想學習WCF分布式開發的人來說,成功開發、配置、部署第一個自己的WCF服務困難重重。很多資料都介紹了WCF的基本概念。但是對于實際的項目開發過程介紹粗略,給入門者帶來諸多不便。今天我們就來補充一節WCF分布式開發一個完整解決方案的開發和配置過程。本節基本結構是:首先介紹【1】WCF服務解決方案的項目組成【2】WCF服務的開發和配置過程,【3】自定義宿主的開發和配置過程【4】客戶端的服務引用和配置過程?!究偨Y】算是為各位WCF分布式技術開發的愛好者,提供的一個開發參考。
【1】WCF服務解決方案的項目組成:
1.1】WCF服務:
通常來說,WCF服務由三個部分構成:
服務類:包含服務契約、操作契約和數據契約的定義和實現;
宿主:一種應用程序域和進程,服務將在該環境中運行;
終結點:由客戶端用于訪問服務。
我們這里的解決方案包括服務類項目、托管宿主、和簡單的客戶端程序,結構如圖:
1.2】客戶端應用程序:
上一節我們介紹了WCF的基本概念,WCF基本通信機制是基于SOAP消息,SOAP消息基于XML語言,因此WCF應用程序可與運行于各種上下文環境的其他進程進行通信,當然也支持跨系統、跨平臺的應用程序之間的數據交互?;赪CF構建的分布式應用程序可與下列所有程序進行交互:
同一 Windows 計算機上不同進程中的WCF應用程序。
另一 Windows 計算機上的WCF應用程序。
基于其他技術構建的應用程序,如基于 Java 2 企業版 (J2EE) 構建的、支持標準 Web 服務的應用程序服務器。這些應用程序可以運行在 Windows 計算機上,也可以運行在其他操作系統(如 Sun Solaris、IBM 的 z/OS 或 Linux)上。
因此可以作為客戶端的應用程序,并不限制其類型,只要可以解析基于XML的SOAP消息,都可以與WCF的服務端進行通信。.NET平臺上我們可以創建控制臺應用程序、WinForm、Windows服務、ASP.NET應用程序等,來訪問和調用WCF服務。下面我們就來具體介紹自定義托管服務,WCF解決方案的開發配置的詳細過程。
【2】WCF服務類的開發過程:
要創建WCF服務解決方案,首先應該定義服務類,并編寫服務類的相關的代碼。我們這里把服務類創建類單獨的類庫項目,托管宿主程序項目引用服務類的程序集。
2.0】創建WCF服務類庫項目:
WCF服務類庫項目的創建非常簡單,Visual Studio 2008為我們提供了便捷的方式,選擇新建項目,選擇--WCF服務類庫項目項目,輸入項目名稱,選擇保存位置就可以。如圖:
當然我們也可以建立空項目,但是程序集引用等操作要手動完整,過程相對復雜。這里我們選擇的使用創建向導方式。
System.ServiceModel和System.Runtime.Serialization程序集對WCF服務至關重要,因為后續服務契約、操作契約和數據契約等特性定義都在這兩個程序集中。我們在新建的項目引用中可以看到:
使用WCF契約相關的屬性,必須顯示引用這兩個命名空間.語句如下:
using System.ServiceModel;
using System.Runtime.Serialization;
如果不添加命名空間引用程序集,編寫的代碼會出現錯誤,無法通過。
2.1】服務契約和操作契約:
WCF服務類庫創建完畢后,我們可以來進行代碼的實際編寫。我們知道,每個WCF服務類均需實現一些方法,以供其客戶端使用。服務類的創建者通過將這些方法包含在某個服務契約中,來決定將哪些方法公開為客戶可調用的操作。服務契約就是顯示指定的服務必須實現的用戶可以使用的操作。
ServiceContract 屬性以及 WCF使用的所有其他屬性均在 System.ServiceModel 命名空間中定義,類聲明使用 using 語句來引用該命名空間。服務類中可被客戶端調用的每個方法都必須使用名為 OperationContract 的另一個屬性加以標記。服務類中帶有前置 OperationContract 屬性的所有方法都將自動被WCF公開為 SOAP 可調用操作。
WCF中最基本的屬性是 ServiceContract。實際上,WCF服務類本身就是標記有 ServiceContract 屬性的類或者是實現了標記有該屬性的接口的類。我們使用的還是上次的代碼:
首先是服務契約IWCFService,定義了連個操作,添加[OperationContract]屬性標記:
//1.服務契約[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
//操作契約
[OperationContract]
string SayHello(string name);
//操作契約
[OperationContract]
string SayHelloToUser(User user);
}【3】自定義宿主的開發和配置過程:
我們這里使用的控制臺程序為托管宿主,我們這里講解托管宿主的代碼編寫和配置文件的設置過程。
3.1】托管宿主程序的創建:
使用VS2008新建控制臺應用程序,非常簡單,選擇新建項目-控制臺程序,即可。
3.2】托管宿主代碼編寫:
這里要添加對WCF服務類庫項目的引用,另外要引用ServiceModel程序集。ServiceHost類位于ServiceModel命名空間下。這里比較重要的步驟就是,定義一個ServiceHost實例,定義地址,定義終結點使用ABC地址、契約、綁定。
代碼如下:
//反射方式創建服務實例,//Using方式生命實例,可以在對象生命周期結束時候,釋放非托管資源
using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))
{
//相同的服務注冊多個基地址
//添加服務和URI,用戶資源標識符
Uri tcpAddress = new Uri("NET.tcp://localhost:8001/WCFService");
Uri httpAddress = new Uri("http://localhost:8002/WCFService");
Uri pipeAddress = new Uri("NET.pipe://localhost:8002/WCFService");
host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NETTcpBinding() , tcpAddress);
host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), httpAddress);
host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NETNamedPipeBinding(), pipeAddress);
//判斷是否以及打開連接,如果尚未打開,就打開偵聽端口
if (host.State !=CommunicationState.Opening)
host.Open();
//顯示運行狀態
Console.WriteLine("Host is runing! and state is {0}",host.State);
//等待輸入即停止服務
Console.Read();
}【4】客戶端的服務引用、配置和開發過程:
服務類和服務宿主已經配置完畢,下面我們來講述客戶端添加WCF服務的引用、配置和服務調用過程。
首先要運行宿主程序,這樣才能在客戶端添加服務引用,從元數據獲取服務類的相關信息,生成本地類。
4.1】添加WCF服務引用:
服務瀏覽器,單擊客戶端項目,添加Services Reference.在彈出的窗口地址里輸入服務的基地址,首先查找TCP服務。
保持地址和配置文件里服務的基地址相同,:查找成功后的窗口如下:
我們可以看到WCF服務類公布的操作,輸入命名空間的名字為ServiceReferenceTcp。同樣的方式添加對HTTP服務的引用。添加成功后我們可以查看所有文件,在客戶端項目的服務引用的窗口看到所有的服務引用的文件信息如圖:
證明我們添加WCF服務成功??蛻舳薬pp.config文件里會生成相應的服務代理的相關信息,包括客戶端終結點的信息:
<client><endpoint address="http://localhost:8001/WCFService" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IWCFService" contract="ServiceReferenceTcp.IWCFService"
name="WSHttpBinding_IWCFService">
<identity>
<userPrincipalName value="FRANK/Administrator" />
identity>
endpoint>
<endpoint address="NET.tcp://localhost:8002/WCFService" binding="NETTcpBinding"
bindingConfiguration="NETTcpBinding_IWCFService" contract="ServiceReferenceTcp.IWCFService"
name="NETTcpBinding_IWCFService">
<identity>
<userPrincipalName value="FRANK/Administrator" />
identity>
endpoint>
<endpoint address="http://localhost:8001/WCFService" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IWCFService1" contract="ServiceReferenceHttp.IWCFService"
name="WSHttpBinding_IWCFService1">
<identity>
<userPrincipalName value="FRANK/Administrator" />
identity>
endpoint>
<endpoint address="NET.tcp://localhost:8002/WCFService" binding="NETTcpBinding"
bindingConfiguration="NETTcpBinding_IWCFService1" contract="ServiceReferenceHttp.IWCFService"
name="NETTcpBinding_IWCFService1">
<identity>
<userPrincipalName value="FRANK/Administrator" />
identity>
endpoint>
client>
NET技術:WCF分布式開發步步為贏(2)自定義托管宿主WCF解決方案開發配置過程詳解,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。