WCF入門教程(一)簡介
1、WCF是什么?
WCF( Windows Communication Foundation), 是Microsoft為構建面向服務的應用提供的分布式通信編程框架,是.NET Framework 3.5的重要組成部分。使用該框架,開發人員可以構建跨平台、安全、可靠和支持事務處理的企業級互聯應用解決方案。
簡單的說:WCF就是分布式通信框架。
2、WCF主要構成
Endpoint
Endpoint是WCF實現通信的核心要素。一個WCF Service由一個Endpoint集合組成,每個Endpoint就是用於通信的入口,客戶端和服務端通過Endpoint交換信息。
Endpoint由三部分組成:Address,Binding,Contract。便於記憶,我們往往將這三部分稱為是WCF的ABC。
Address
Address通過一個URI唯一地標識一個Endpoint,並告訴潛在的WCF service的調用者如何找到這個Endpoint。
Binding
Binding實現在Client和Service通信的所有底層細節。比如Client與Service之間傳遞的Message是如何編碼的—— text/XML, binary,MTOM;這種Message的傳遞是采用的哪種Transport——TCP, Http, Named Pipe, MSMQ; 以及采用怎樣的機制解決Secure Messaging的問題——SSL,Message Level Security。所以Binding解決的是How to communicate with service?
Contract
Contract的主要的作用是定義通信協議,具體Service提供了哪些方法。
Behavior
Behavior: Behavior的主要作用是定制Endpoint在運行時的一些必要的Behavior。比如Service回調Client的Timeout;Client采用的Credential type;以及是否支持Transaction等。
3、WCF構建流程
(1)、定義服務協定。 服務協定指定服務的簽名、服務交換的數據和其他協定要求的數據
(2)、實現協定。 若要實現服務協定,請創建實現協定的類並指定運行時應具有的自定義行為。
(3)、通過指定終結點和其他行為信息來配置服務
(4)、承載服務
(5)、生成客戶端應用程序。
4、簡單實例
通過最簡單的計算器功能來解釋具體的實現過程
1)首先定義契約,這個協議就是定義通信接口
/// <summary> /// 計算協議 /// </summary> [ServiceContract(Namespace = "http://www.yank.com/")] public interface ICalculator { /// <summary> /// 加 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> [OperationContract] double Add(double x, double y); /// <summary> /// 減 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> [OperationContract] double Subtract(double x, double y); /// <summary> /// 乘 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> [OperationContract] double Multiply(double x, double y); /// <summary> /// 除 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> [OperationContract] double Divide(double x, double y); }
2)通過具體類實現接口功能
/// <summary> /// 計算器具體實現 /// </summary> public class CalculatorService : ICalculator { /// <summary> /// 加 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public double Add(double x, double y) { return x + y; } /// <summary> /// 減 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public double Subtract(double x, double y) { return x - y; } /// <summary> /// 乘 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public double Multiply(double x, double y) { return x * y; } /// <summary> /// 除 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public double Divide(double x, double y) { return x / y; } }
3)根據契約(Contract),綁定(Binding)和地址(Address),創建服務節點(ServiceEndPoint)
4)將服務節點承載在主機(Host)中,例子將host承載在一個控制台程序中。
#region 采用代碼方式實現對契約的綁定 Uri baseAddress = new Uri("http://127.0.0.1:9999/"); using (ServiceHost host = new ServiceHost(typeof(CalculatorService), baseAddress)) { //使用指定的協定、綁定和終結點地址將服務終結點添加到承載服務中 host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); #region Behavior ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/CalculatorService/metadata"); host.Description.Behaviors.Add(behavior); #endregion host.Opened += delegate { Console.WriteLine("CalculaorService已經啟動,按任意鍵終止服務!"); }; host.Open(); Console.Read(); } #endregion
5)客戶端調用,通過Channel方式調用
namespace ClientWithChannel { class Program { static void Main(string[] args) { using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:9999/CalculatorService")) { ICalculator proxy = channelFactory.CreateChannel(); using (proxy as IDisposable) { Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, proxy.Add(1, 2)); Console.WriteLine("x - y = {2} when x = {0} and y = {1}", 1, 2, proxy.Subtract(1, 2)); Console.WriteLine("x * y = {2} when x = {0} and y = {1}", 1, 2, proxy.Multiply(1, 2)); Console.WriteLine("x / y = {2} when x = {0} and y = {1}", 1, 2, proxy.Divide(1, 2)); Console.ReadLine(); } } } } }
6)運行Host的Console程序,將服務啟動,進行監聽,然后啟動客戶端程序測試調用。
Host啟動
Client運行結果
5、源碼地址:
http://files.cnblogs.com/yank/WCFServices.zip