WCF入门(一)——简单的示例
這篇隨筆寫了一段時間了,當時沒有發(fā)布,今天整理文檔的時候發(fā)現(xiàn)了,順便給配了些圖。主要是紹了一下WCF編程模型,并給了一個簡單的示例。
概述
WCF框架是下一代.NET平臺通信應(yīng)用程序的核心。它包含了Web服務(wù)、Remoting、同步和異步消息應(yīng)用程序的開發(fā),合并了所有最近有關(guān)的各種標準,建立了通過XML配置文件替代C#代碼(如果你喜歡的話可以繼續(xù)使用代碼)對服務(wù)定義進行配置的模型。
WCF的設(shè)計思路是使開發(fā)者可以專注于開發(fā)所需的業(yè)務(wù)邏輯而不是增加工作(服務(wù)器和客戶端之間的通信、數(shù)據(jù)傳輸?shù)?#xff09;,WCF將為你處理這些問題,并且通過使用擴展的配置文件讓一切變得更加容易實現(xiàn)。
?
WCF程序結(jié)構(gòu)
一個完整的WCF解決方案包括如下四個部分:
- 契約(Contracts):????主要定義了實現(xiàn)那些服務(wù),如何訪問服務(wù)
- 服務(wù)(Services):????????實現(xiàn)契約定義的方法
- 宿主程序(Hosting):????提供低層傳輸功能的支持
- 客戶端(Client):????????根據(jù)契約訪問服務(wù)
下面我們就來逐一講解如何實現(xiàn)一個簡單的WCF程序。
?
實現(xiàn)契約和服務(wù)
契約通常是一個接口,定義了我們會提供哪些服務(wù)。以一個簡單的計算器為例,假如我們要提供一個加減法的服務(wù),則定義接口如下:
????public interface Icalculator
????{
????????double Add(double x, double y);
????????double Subtract(double x, double y);
????}
而服務(wù)則是如何實現(xiàn)這個契約,對于上述接口,實現(xiàn)方式如下:
????public class CalculatorService : Icalculator
????{
????????public double Add(double x, double y)
????????{
????????????return x + y;
????????}
????????public double Subtract(double x, double y)
????????{
????????????return x - y;
????????}
????}
對契約和服務(wù)有了基本了解后,我們就可以在WCF程序中實現(xiàn)它了,我們通常把契約和服務(wù)放在一個類庫項目中實現(xiàn),首先新建一個WCF服務(wù)庫項目(也可以新建一個類庫項目,然后添加System.ServiceModel.dll的引用):
使用WCF服務(wù)庫項目模板創(chuàng)建項目后,發(fā)現(xiàn)系統(tǒng)會自動提供了一個簡單的契約和服務(wù)的實現(xiàn),在這里我們將其替換成前面定義的接口和實現(xiàn)。
首先把契約文件IService1.cs替換成我們的接口:
????[ServiceContract]
????public interface ICalculator
????{
????????[OperationContract]
????????double Add(double x, double y);
????????[OperationContract]
????????double Subtract(double x, double y);
????}
可以看到,和前面定義的基本接口有點區(qū)別的是:
- 接口名稱上加了ServiceContract屬性
- 接口方法上加了OperationContract屬性
這個是告訴WCF宿主程序定義的契約名稱和要實現(xiàn)的接口,否則WCF宿主程序也無法知道該如何加載服務(wù)。實現(xiàn)服務(wù)的代碼和前面一樣,這里就不列出來了。
實現(xiàn)完我們的服務(wù)和契約后,按Ctrl+F5后就可以直接測試了。雖然我們沒有編寫客戶端,但系統(tǒng)自動提供了一個WcfTestClient供使用的:
關(guān)于WCF測試客戶端的更多信息,可以參看MSDN文章:啟用WCF測試客戶端(WCF Test Client)的相關(guān)技巧。
?
實現(xiàn)宿主程序
前面我們可以看到,編寫WCF服務(wù)端程序時,雖然我們并沒有實現(xiàn)宿主程序,但在客戶端仍然能夠訪問服務(wù)。這是因為在測試Wcf庫的時候,系統(tǒng)自動啟動了一個宿主程序WcfSvcHost.exe,并加載了該服務(wù),以便我們能測試訪問。不過WcfSvcHost.exe只是一個輕量級的宿主程序,主要用于測試用,對于實際項目,我們可以把它部署到IIS中,都可以不用編寫自己的宿主程序。
除了IIS外,我們也可以編寫自己的宿主程序,通過一個控制臺或窗口程序來實現(xiàn)宿主程序,這樣也可以在沒有IIS的機器上運行我們的服務(wù),也可以更改低層傳輸協(xié)議,從而獲取更高的傳輸效率等。
實現(xiàn)宿主程序也比較簡單,首先創(chuàng)建一個控制臺項目,然后添加System.ServiceModel.dll和前面定義的服務(wù)項目WcfService的引用,然后就可以實現(xiàn)宿主程序了:
????????static void Main(string[] args)
????????{
????????????ServiceHost host = new ServiceHost(typeof(CalculatorService));
????????????host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://localhost:8733/Design_Time_Addresses/WcfService/Service1/");
????????????if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
????????????{
????????????????ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
????????????????behavior.HttpGetEnabled = true;
????????????????behavior.HttpGetUrl = new Uri("http://localhost:8733/Design_Time_Addresses/WcfService/Service1/wsdl");
????????????????host.Description.Behaviors.Add(behavior);
????????????}
????????????host.Open();
????????????Console.WriteLine("CalculaorService已經(jīng)啟動,按任意鍵終止服務(wù)!");
????????????Console.Read();
????????????host.Close();
????????}
這里的大部分都是配置操作,這個配置對新手來說非常多,寫在代碼里也不好看,因此通常是寫在App.Config中,我這里是直接把WcfService工程中<system.serviceModel>節(jié)直接拷貝過來的。要修改這個配置,可以使用VisualStudio中的WCF服務(wù)配置編輯器。
把配置挪到App.Config中后,代碼可以簡化如下:
????static void Main(string[] args)
????{
????????ServiceHost host = new ServiceHost(typeof(CalculatorService));
????????host.Open();
????????Console.WriteLine("CalculaorService已經(jīng)啟動,按任意鍵終止服務(wù)!");
????????Console.Read();
????????host.Close();
????}
從代碼中可以看到,我們只需要創(chuàng)建一個ServiceHost對象,然后調(diào)用Open方法開啟服務(wù)即可,并不需要什么額外的操作,非常簡單。
?
實現(xiàn)客戶端
要實現(xiàn)客戶端,我們需要知道如下兩個信息:
- 服務(wù)端提供了那些服務(wù)
- 該如何采取這些方式訪問服務(wù)
這個信息可以通過宿主程序發(fā)布的wsdl獲取,客戶端無需知道服務(wù)區(qū)的實現(xiàn)細節(jié),直接根據(jù)wsdl地址即可。例如,對于前面的例子中,我的服務(wù)地址是:http://localhost:8733/Design_Time_Addresses/WcfService/Service1/(在App.config中配置的),直接通過瀏覽器可以wsdl的發(fā)布地址,并能獲取相關(guān)信息。
有了該信息后,借助VisualStudio的強大功能就可以非常快捷的實現(xiàn)客戶端程序了。我們首先插件一個控制臺程序,然后添加web服務(wù)引用:
添加該服務(wù)后,和WebService一樣,系統(tǒng)自動生成了Client類。
借助這個Client類,就可以訪問前面的服務(wù)了。
????static void Main(string[] args)
????{
????????using (var proxy = new CalculatorClient())
????????{
????????????Console.WriteLine("{0} + {1} = {2}", 3, 5, proxy.Add(3, 5));
????????????Console.WriteLine("{0} - {1} = {2}", 3, 5, proxy.Subtract(3, 5));
????????}
????}
實際上,根據(jù)服務(wù)端發(fā)布的wsdl信息,也可以使用java等其它語言編寫,是一種非常靈活的方式。
?
小結(jié)
從本文中的這個例子可以看出,WCF非常好的上屏蔽了低層細節(jié)(服務(wù)器和客戶端之間的通信、數(shù)據(jù)傳輸?shù)?#xff09;,開發(fā)者只需要關(guān)注業(yè)務(wù)邏輯即可,并且非常靈活,是一門非常優(yōu)秀的RMI技術(shù)。
關(guān)于WCF園子里有許多文章,這些都是非常好的學習材料,我目前也只是處于管中窺豹的階段,后續(xù)有空再寫寫相關(guān)文章。
- 我的WCF之旅(1):創(chuàng)建一個簡單的WCF程序
- 我的WCF之旅(2):Endpoint Overview
- 我的WCF之旅(3):在WCF中實現(xiàn)雙向通信(Bi-directional Communication)
- 我的WCF之旅(4):WCF中的序列化(Serialization)- Part I
- 我的WCF之旅(4):WCF中的序列化(Serialization)- Part II?
- 我的WCF之旅(5):Service Contract中的重載(Overloading)
- 我的WCF之旅(6):在Winform Application中調(diào)用Duplex Service出現(xiàn)TimeoutException的原因和解決方案
- 我的WCF之旅(7):面向服務(wù)架構(gòu)(SOA)和面向?qū)ο缶幊?#xff08;OOP)的結(jié)合——如何實現(xiàn)Service Contract的繼承?
- 我的WCF之旅(8):WCF中的Session和Instancing Management?
- 我的WCF之旅(9):如何在WCF中使用tcpTrace來進行Soap Trace
- 我的WCF之旅(10): 如何在WCF進行Exception Handling?
- 我的WCF之旅(11):再談WCF的雙向通訊-基于Http的雙向通訊 V.S. 基于TCP的雙向通訊?
- 我的WCF之旅(12):使用MSMQ進行Reliable Messaging
- 我的WCF之旅(13):創(chuàng)建基于MSMQ的Responsive Service
轉(zhuǎn)載于:https://www.cnblogs.com/TianFang/archive/2012/12/26/2834206.html
總結(jié)
以上是生活随笔為你收集整理的WCF入门(一)——简单的示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “遥闻旅宿梦兄弟”下一句是什么
- 下一篇: ff15原画是谁画的呢?