首先,先簡單瞭解一下什麼是WCF(Window Communication Foundation),是微軟爲構建面向服務的應用程序所提供的統一編程模型,可以解決不一樣應用程序域,不一樣平臺之間的通訊問題。WCF統一了多重分佈式技術:Webservice、.NetRemoting、.Net企業服務、微軟的消息隊列(MSMQ)。一個WCF有幾個基本概念必需要了解的,編程
契約(ServiceContract):契約是屬於一個服務公開的公共接口,定義了服務端公開的服務方法、使用的傳輸協議、可訪問的地址以及傳輸的消息格式等。既契約告訴咱們能幹什麼。c#
地址(Address):在WCF框架中,每一個服務都具備惟一的地址,其餘服務或者客戶端經過這個地址能夠訪問到這個服務。框架
綁定(Binding):綁定定義了服務與外部通訊的方式。它由一組稱爲綁定元素的元素而構成,這些元素組合在一塊兒造成通訊基礎結構。分佈式
終結點(EndPoint):終結點是用來發送或接收消息(或同時執行這兩種操做)的構造。一個終節點由三個要素組成,分別是:地址、綁定和契約。函數
宿主(Host):WCF服務必須承載於某個進程中。宿主是控制服務的生存期的應用程序。工具
瞭解了WCF的一些基本概念後,接下來去搭一個簡單的WCF服務,首先定義一個接口:測試
[ServiceContract]//在接口上聲明ServiceContract特性,表示這個是一個契約 public interface IWCFDemo { [OperationContract]//在方法上聲明OperationContract表示該方法是一個對外的服務 int Add(int a,int b); [OperationContract] int Del(int a,int b); string GetTime();//此方法未被聲明是一個對外的服務 }
上面的代碼中,接口上打上ServiceContract,在這須要添加ServiceContract的引用,在System.ServiceModel程序集下,表示該接口是一個契約,在方法上聲明OperationContract,表示該方法是一個對外的服務,遠程客戶端能夠調用的到該方法,其中string GetTime();未被聲明OperationContract,這個方法不對外公佈。spa
而後是添加服務去實現IWCFDemo這個接口調試
public class WCFDemo : IWCFDemo//實現IWCFDemo接口 { public int IWCFDemo.Add(int a, int b) { return a + b; } public int IWCFDemo.Del(int a, int b) { return a - b; } public string IWCFDemo.GetTime() { return DateTime.Now.ToString(); } }
好了至此,咱們已經把一個WCF的服務給建立好了,接下來是要將這個服務承載於宿主中。和爲這個服務分配一個訪問的地址。這時,須要新建一個App.config配置文件code
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <services> <!--配置一個服務(注意:這裏能夠配置多個服務)--> <service name="BLL.WCFDemo" behaviorConfiguration="behaviorConfiguration"> <!--name爲服務的名稱,behaviorConfiguration給這個服務定義一些行爲--> <host> <baseAddresses> <add baseAddress="http://127.0.0.1:8090/"/><!--服務的訪問地址--> </baseAddresses> </host> <!--終結點由地址,綁定,契約--> <endpoint address="" binding="basicHttpBinding" contract="IBLL.IWCFDemo"> </endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="behaviorConfiguration"> <serviceMetadata httpGetEnabled="true"/><!--給behaviorConfiguration定義一些行爲--> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
接下來是爲這個服務提供一個運行的宿主,經過該宿主程序來啓動咱們的服務。這裏可使用控制檯程序,winform程序。在這,使用了控制檯程序
ServiceHost host=new ServiceHost(typeof(WCFDemo));//將服務寄宿在宿主中 host.Open();//運行 Console.WriteLine("服務已啓動、、、"); Console.ReadKey(true); host.Close();關閉
好了,到了這一步咱們就能夠測試一下能不能調用獲得服務,先是啓動宿主,讓服務在宿主中運行
而後打開WCF測試客戶端,在VS的安裝目錄下~\Microsoft Visual Studio 11.0\Common7\IDE目錄下的WcfTestClient.exe,在文件->添加服務中,將服務的地址輸入進去,這時就能夠看到正在運行的服務,咱們發現,只有Add()與Del(),兩個方法,而GetTime()因爲沒有聲明爲對外的服務,在這是沒法調用的到。
在雙擊某一個服務時在右邊的窗口,會出現一個能夠調用該服務的窗口
上面的方法是用自帶的WCF客戶端測試工具測試,若是須要本身模擬一個客戶端去測試的話會比較麻煩一點,下面詳細的介紹一下如何去模擬客戶端來測試WCF服務。在這我用控制檯應用程序來作測試。首先新建一個客戶端Client控制檯應用程序。
而後是啓動vs開發人員命令提示,執行「cd:E:\c#項目\WCFDemo」-->"E:"定位到項目的解決方案的目錄下,啓動WCF的宿主服務,執行「svcutil http://localhost:8090/?wsdl /o:WCFDemoClient.cs」
將生成的WCFDemoClient.cs與output.config文件添加到新建的Client控制檯的應用程序中,並把output.config文件名改成App.cinfig。在主程序中去調用WCF服務
static void Main(string[] args) { WCFDemoClient client = new WCFDemoClient(); Console.WriteLine(client.Add(2, 3)); Console.ReadKey(); }
調試時將宿主程序運行起來,而後啓動客戶端的程序,當咱們調用Add()這個函數時,控制檯輸出的結果爲5,表示咱們已經調用了這個服務
至此,一個簡單的WCF服務的Demo已經基本完成,當一個程序中有許多不一樣的服務,能夠將不一樣的服務綁定不一樣的地址對外發布,服務端就能夠調用獲得對外發布的服務,能夠輕鬆的作到集羣,而且其中一個服務出現問題,而不影響其餘的服務,下降耦合度,便於維護。