WCF經過Contract來講明服務和操做,通常包含五種類型的Contract:ServiceContract,OperationContract,FaultContract,DataContract,MessageContract。css
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: }
OperationContract定義在ServiceContract的內部,定義了具體的服務操做。在此基礎上,能夠對操做的事務,綁定(One-way,Two-way等)和FaultContract信息。安全
1: [ServiceContract]
2: interface IMyContract
3: {
4: [FaultContract(typeof(MyFaultContract))]
5: [OperationContract]
6: string MyMethod();
7: }
定義了服務器和客戶端交互的內容,它能夠標識類,以便做爲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: }
當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:
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: }
DataContract提供了一種將.net的CLR類型映射爲能夠被其餘應用程序識別的基於W3C的Xml的方法,使得不一樣的應用間無須考慮對應使用的是什麼類型的數據,而只需關注這些被抽象的Xml信息。code
MessageContract則描述了SOAP消息的結構,最終在服務器和客戶端進行傳遞,所以可以對SOAP信息的Header和Bodies進行直接的訪問和處理,能夠對複雜的類型進行處理。htm
MessageContract通常只在你須要對消息體進行直接控制的時候使用,例如添加特定的Header,Footer等信息。在一些場合,若是須要在消息中包含Session相關的信息時,經過Header進行傳遞,則無需像消息體中增長額外的參數。或者有時你須要提供一個自定義的安全協議或者在應用間傳遞身份令牌。接口
固然,使用MessageContract時須要從SOAP Header中檢索信息,而不是直接序列化後進行處理。事務
對於一個OperationContract來講,不要在參數和返回值中分別使用MessageContract和DataContract,不然在生成WSDL時會引發運行時錯誤。