WCF筆記(4)消息協定

一、消息協定和數據協定的定義方式相同,爲類添加消息協定特性(MessageContract),這樣我們就可以定義一個消息協定類了

二、示例代碼

 /// <summary>
    /// 數據協定類(藝術品信息)
    /// </summary>
    [DataContract]
    public class ArtInfo
    {
        /// <summary>
        /// 藝術品名稱
        /// </summary>
        [DataMember]
        public string ArtName { get; set; }

        /// <summary>
        /// 創作時間
        /// </summary>
        [DataMember]
        public DateTime CreateTime { get; set; }
    }

    /// <summary>
    /// 消息協定類(藝術家)
    /// </summary>
    [MessageContract]
    public class Artist
    {
        /// <summary>
        /// 姓名
        /// </summary>
        [MessageHeader]
        public string Name { get; set; }

        /// <summary>
        /// 年齡
        /// </summary>
        [MessageBodyMember]
        public int Age { get; set; }

        /// <summary>
        /// 作品信息
        /// </summary>
        [MessageBodyMember]
        public ArtInfo ArtInfo { get; set; }
    }    

服務端

  class Program
    {
        //設置服務並啓動
        static void Main()
        {
            //服務基地址
            var baseUri = new Uri("http://localhost:3000/Service");
            //聲明服務器主機
            using (var host = new ServiceHost(typeof(MyService), baseUri))
            {
                //添加綁定和終結點
                var binding = new WSHttpBinding();
                host.AddServiceEndpoint(typeof(IService), binding, "test");
                //添加服務描述
                host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
                //啓動服務
                try
                {
                    host.Open();
                    Console.WriteLine("服務已啓動");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey();
                //關閉服務
                host.Close();
            }
        }
    }

    /// <summary>
    /// 定義服務協定
    /// </summary>
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        void SetArtistInfo(Artist artist);
    }

    /// <summary>
    /// 實現服務協定
    /// </summary>
    public class MyService : IService
    {      
        public void SetArtistInfo(Artist artist)
        {
            Console.WriteLine("作家信息");
            Console.WriteLine("姓名:{0}", artist.Name);
            Console.WriteLine("年齡:{0}", artist.Age);
            Console.WriteLine("--------作品信息------");
            ArtInfo artInfo = artist.ArtInfo;
            Console.WriteLine("作品名稱:{0}", artInfo.ArtName);
            Console.WriteLine("創作時間:{0}", artInfo.CreateTime.ToString
                                        ("yyyy年MM月dd日hh時mm分ss秒"));                 
        }
    }
    
服務啓動後我們在客戶端添加服務引用,添加服務引用後我們可以看到我們在服務端定義的方法發生了變化



客戶端

using System;

namespace Client
{
    class Program
    {
        static void Main()
        {
            var sc = new WS.ServiceClient();           
            var artInfo = new WS.ArtInfo
            {
                ArtName = "武直十",
                CreateTime = DateTime.Now
            };
            
             /*調用服務端方法設置藝術家信息(注意這裏的"SetArtistInfo"方法)
            已經和我們在服務端定義的方法不一樣了:Client.WS.ServiceClient.SetArtistInfo(string, int, Client.WS.ArtInfo)
            原來服務端: void SetArtistInfo(Artist artist);方法
            這說明定義爲"消息協定的類"在當做傳入參數的時候,它內部定義爲消息體和消息頭的成員都被拆開了
            消息體和消息頭的區別:定義爲"消息頭的成員"在拆分的時候會被拆分成該方法的第一個參數
            如我們定義的:[MessageHeader] public string Name { get; set; },
            最後在客戶端我們看到public void SetArtistInfo(string Name, int Age, Client.WS.ArtInfo ArtInfo)
            */
            sc.SetArtistInfo("老鬼", 55, artInfo);
           Console.ReadKey();
        }
    }
}


需要特別注意的:

a、消息協定作爲傳入參數,則只能有一個參數,以下定義是錯誤的:

void Reconcile(BankingTransaction bt1, BankingTransaction bt2);

b、除非你返回值爲void,如不是,那你必須返回一個消息協定,bool UpLoadFile(TransferFileMessage tMsg)我們這個定義明顯不符合要求。




發佈了88 篇原創文章 · 獲贊 6 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章