WCF入門教程(一)簡介


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

 


免責聲明!

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



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