一、消息協定和數據協定的定義方式相同,爲類添加消息協定特性(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)我們這個定義明顯不符合要求。