標籤:
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:效果
服務端
用戶端:
源碼下載
好了就講這麼多了。歡迎指正
我們一起學習WCF 第五篇資料合約和訊息合約(附上源碼)