理解WCF中的Contracts

WCF中的Contracts

WCF經過Contract來講明服務和操做,通常包含五種類型的Contract:ServiceContract,OperationContract,FaultContract,DataContract,MessageContract。css

 

1.ServiceContract

ServiceContract向外部暴漏了能夠提供的服務接口,它能夠包含服務名稱、命名空間等服務器端的配置信息。html

   1:  [ServiceContract]
   2:  interface IMyContract
   3:  {
   4:   [OperationContract]
   5:   string MyMethod();
   6:  }
   7:   
   8:  class MyService : IMyContract
   9:  {
  10:   public string MyMethod()
  11:   {
  12:   return "Hello World";
  13:   }
  14:  }

 

2.OperationContract

OperationContract定義在ServiceContract的內部,定義了具體的服務操做。在此基礎上,能夠對操做的事務,綁定(One-way,Two-way等)和FaultContract信息。安全

 

   1:   [ServiceContract]
   2:   interface IMyContract
   3:   {
   4:   [FaultContract(typeof(MyFaultContract))]
   5:   [OperationContract]
   6:   string MyMethod();
   7:   }

 

3.Data Contract

定義了服務器和客戶端交互的內容,它能夠標識類,以便做爲OperationContract的參數或者返回類型。服務器

   1:  [DataContract]
   2:  class Person
   3:  {
   4:   [DataMember]
   5:   public string ID;
   6:   [DataMember]
   7:   public string Name;
   8:  }
   9:   
  10:  [ServiceContract]
  11:  interface IMyContract
  12:  {
  13:   [OperationContract]
  14:   Person GetPerson(int ID);
  15:  }

 

4.MessageContract

當OperationContract須要傳遞參數或者返回值時,可使用MessageContract。它能夠定義消息的Header和Body,以及安全性等。spa

   1:  [ServiceContract]
   2:  public interface IRentalService
   3:  {
   4:   [OperationContract]
   5:   double CalPrice(PriceCalculate request);
   6:  }
   7:   
   8:  [MessageContract]
   9:  public class PriceCalculate
  10:  {
  11:   [MessageHeader]
  12:   public MyHeader SoapHeader { get; set; }
  13:   [MessageBodyMember]
  14:   public PriceCal PriceCalculation { get; set; }
  15:  }
  16:   
  17:  [DataContract]
  18:  public class MyHeader
  19:  {
  20:   [DataMember]
  21:   public string UserID { get; set; }
  22:  }
  23:   
  24:  [DataContract]
  25:  public class PriceCal
  26:  {
  27:   [DataMember]
  28:   public DateTime PickupDateTime { get; set; }
  29:   [DataMember]
  30:   public DateTime ReturnDateTime { get; set; }
  31:   [DataMember]
  32:   public string PickupLocation { get; set; }
  33:   [DataMember]
  34:   public string ReturnLocation { get; set; }
  35:   }
  36:   

 

5.FaultContract

FaultContract定義了服務可能出現的異常信息,以及服務隊錯誤的處理和錯誤信息拋出到客戶端的內容。一個OperationContact能夠包含0個或多個FaultContract。.net

   1:  [ServiceContract]
   2:  interface IMyContract
   3:  {
   4:   [FaultContract(typeof(MyFaultContract1))]
   5:   [FaultContract(typeof(MyFaultContract2))]
   6:   [OperationContract]
   7:   string MyMethod();
   8:   
   9:   [OperationContract]
  10:   string MyShow();
  11:   }

 

MessageContract和DataContract的比較

區別

DataContract提供了一種將.net的CLR類型映射爲能夠被其餘應用程序識別的基於W3C的Xml的方法,使得不一樣的應用間無須考慮對應使用的是什麼類型的數據,而只需關注這些被抽象的Xml信息。code

MessageContract則描述了SOAP消息的結構,最終在服務器和客戶端進行傳遞,所以可以對SOAP信息的Header和Bodies進行直接的訪問和處理,能夠對複雜的類型進行處理。htm

 

爲何須要或者何時使用MessageContract

MessageContract通常只在你須要對消息體進行直接控制的時候使用,例如添加特定的Header,Footer等信息。在一些場合,若是須要在消息中包含Session相關的信息時,經過Header進行傳遞,則無需像消息體中增長額外的參數。或者有時你須要提供一個自定義的安全協議或者在應用間傳遞身份令牌。接口

固然,使用MessageContract時須要從SOAP Header中檢索信息,而不是直接序列化後進行處理。事務

 

不要混用MessageContract和DataContract

對於一個OperationContract來講,不要在參數和返回值中分別使用MessageContract和DataContract,不然在生成WSDL時會引發運行時錯誤。

相關文章
相關標籤/搜索