A:數據協定(“數據協定”是在服務與客戶端之間達成的正式協議,用于以抽象方式描述要交換的數據。 也就是說,為了進行通信,客戶端和服務不必共享相同的類型,而只需共享相同的數據協定。 數據協定為每個參數或返回類型精確定義為進行交換而序列化哪些數據(將哪些數據轉換為 xml)摘自MSDN)也就說數據協定是客戶端和服務端之間達成的數據協議,相互通信的參數會被序列化然后進行傳輸。那么我用圖來表示為什么用數據協定。
下面用圖來說明其幾個用處
那么下面我們來看看數據協定的代碼實現
1:創建一個協定類
1 [DataContract] 2 public class People 3 { 4 /// <summary> 5 /// ID 6 /// </summary> 7 [DataMember(Name="MID")] 8 public string ID { set; get; } 9 /// <summary>10 /// 姓名11 /// </summary>12 [DataMember(Name="MName")]13 public string Name { set; get; }14 /// <summary>15 /// 序號16 /// </summary>17 [DataMember(Name="MNumber")]18 public string Number { set;get; }19 /// <summary>20 /// 年齡21 /// </summary>22 [DataMember(Name="Mage")]23 public string Age { set; get; }24 }
2:創建接口
[OperationContract]
People GetPeople(string ID);
3:實現接口
1 public class Service:IService 2 { 3 public People GetPeople(string ID) 4 { 5 People pp=new People(); 6 pp.ID = Guid.NewGuid().ToString(); 7 pp.Name = "小馬"; 8 pp.Age = "22"; 9 pp.Number = "13559846";10 return pp;11 }
4:服務端同上篇看看效果
5:解釋:我們在協定類的屬性最后都是按照我們定義的這么一來起著保護類實體的作用。
以上就是我簡單理解的數據協定。不足之處請指正
B:消息協定
為什么用消息協定:
您可能希望使用單個類型來表示整個消息。 雖然可將數據協定用于此目的,但建議使用消息協定來執行此操作,這可以避免在得到的 XML 中采用不必要的包裝級別。 此外,使用消息協定可以對得到的消息進行更多的控制。 例如,您可以決定哪些信息段應包含在消息正文中,哪些信息段應包含在消息頭中
從圖中我們可以看出消息協定比數據協定對信息更加容易控制。
那么我們來用代碼表示一下
1:首先我們定義一個頭消息(專門用于檢測用戶登錄信息)
1 [MessageContract] 2 public class CheckInfo 3 { 4 /// <summary> 5 /// 用戶名 6 /// </summary> 7 [MessageHeader] 8 public string UserName { set; get; } 9 /// <summary>10 /// 密碼11 /// </summary>12 [MessageHeader]13 public string Pwd { set; get; } 14 }
2:開始定義正文信息(用戶信息)
1 [MessageContract] 2 public class UserInfo3 {4 [MessageBodyMember]5 public string RealName { set; get; }6 [MessageBodyMember]7 public string Age { set; get; }8 [MessageBodyMember]9 public Details Udetails { set; get; }
3:做完這些之后我們就去實現這些代碼(首先進行在頭消息進行驗證)
public UserInfo RetUserInfo(CheckInfo cki) { UserInfo uf = new UserInfo(); if (cki.UserName == "admin") { if (cki.Pwd == "123456") { Console.WriteLine(cki.UserName + ":登錄成功{0} ", DateTime.Now); uf = GetUserInfo(); } } else { Console.WriteLine(cki.UserName+":登錄失敗{0} ",DateTime.Now); } return uf; }
4:啟動服務客戶端進行引用
注意: 作為操作協定的輸入消息協定(參數)封裝了操作方法的所有in參數;作為操作協定的返回值的消息協定(return)封裝了out參數和返回值。
也就是說輸入的參數是in類型(把輸入類進行肢解)返回時out類型具體參考源碼
5:效果截圖
服務端
客戶端:
源碼下載
好了就講這么多了。歡迎指正
新聞熱點
疑難解答