WCF入門實例


 

本文是一個wcf的入門例子,沒有想到什么更好的而且簡單的例子。所以功能實現的只是加減法和階乘,目的只是為了引導像我一樣的菜鳥的人,開始探索wcf。

下面進入正題:

首先創建服務接口,或者說contract

 

[ServiceContract] public interface ICalculateService { [OperationContract] int Add(int i, int j); [OperationContract] int Minus(int i, int j); [OperationContract] int Factorial(int i); [OperationContract] int FactorialMyNumber(Number n); }

該接口定義了加減階乘三個操作,第四個操作稍后再說。

對於contract來說需要為其指定[ServiceContract]標記其為wcf要發布的服務,並且其中每一個函數也要標記[OperatioContract],沒有標記不會被服務調用者發現。

 

然后實現該接口

public class CalculateService : ICalculateService { public int Add(int i, int j) { return i + j; } public int Minus(int i, int j) { return i - j; } public int Factorial(int i) { return f(i); } public int FactorialMyNumber(Number n) { return f(n.Num); } private int f(int n) { if (n < 0) throw new NotSupportedException("Number smaller than 0 exist but not supported"); if (n == 0 || n == 1) return 1; else 
                return  n*f(n-1); } }

wcf服務實質上client調用,然后在服務端運行,這種調用就意味着數據傳輸,包括調用信息的傳輸,還包括參數和返回值,而參數返回值必須是可識別的,或者說可以序列化的。.net基本類型默認都是可以識別的,如果是自定義的類就需要做些額外工作。這就是[DataContract]

 

 

[DataContract] public class Number { public Number(int num) { Num = num; } [DataMember] public int Num{get;set;} }

 

對於Number需要指定[DataContract]屬性,對於要發布的成員變量要標記[DataMember],而且是public的,這樣就可以傳輸了。

在上面服務接口第四個就是通過參數把Number傳進來.

Contract 分為ServiceContract和DataContract,一個是行為,一個是數據.

現在服務已經定義完畢,然后就是發布這個服務.服務發布方式有多種,1.可以是自托管,說白了就是自己寫的程序然后發布這個服務,程序關閉了,這個服務就不能被別人調用了,本例就是在控制台程序中發布這個服務。2.是通過windows service,3,是通過IIS發布.

wcf的service實質上是一個EndPoint的集合.EndPoint包括三個要素:ABC.Address,Binding,Contract. Contract已經定義好了.client與調用服務的時候需要知道服務在哪,address就指定了服務的位置,比如在本機發布可以指定位置”http://127.0.0.1:9877/cal”或者”net.tcp://127.0.0.0:9888/”這兩種一個”http”開頭的,一個是”net.tcp”開頭,這就跟binding有關了,binding定義了服務以什么方式發布.包括BasicHttpBinding, NetTcpBinding等等很多種方式,再次就不細講了。

 

ABC簡而言之,A:服務在哪

                   B:服務怎么發布

                     C:服務要干什么

下面就是通過自托管方式啟動一個服務。服務的發布可以通過代碼配置,也可以通過配置文件發布,本文簡單起見,通過代碼進行配置,以后再一點一點詳解其他地方。

 

 

class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(CalculateService), new Uri("http://127.0.0.1:9876/")); host.AddServiceEndpoint(typeof(ICalculateService), new BasicHttpBinding(),"cal"); host.Opened += new EventHandler((obj,arg) => { Console.WriteLine("Service Started,Press Enter Stop Service"); }); host.Open(); Console.ReadLine(); host.Closed += new EventHandler((obj, arg) => { Console.WriteLine("Service Stopped"); }); host.Close(); } }

 

至此,服務已經發布成功.地址是”http://127.0.0.1:9876/”+”cal”=”http://127.0.0.1:9876/cal”binding 如果是NetTcpBinding,地址就應該是”net.tcp:………”了。要發布的服務就是CalculatService。下面就開始調用這些服務。

 client端也是用代碼配置的

static void Main(string[] args) { ICalculateService client= ChannelFactory<ICalculateService>.CreateChannel(new BasicHttpBinding(),
           new EndpointAddress("http://127.0.0.1:9876/cal")); Console.WriteLine(client.Add(1, 2)); Console.WriteLine(client.Factorial(4)); Console.WriteLine(client.FactorialMyNumber(new Number(5))); }

 

第一次寫博客,歡迎大家指正。

 

 源碼

 

注:轉載請注明出處 http://www.cnblogs.com/ITPuppy/archive/2013/04/03/2998618.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM