WCF中的Contracts
WCF通過Contract來說明服務和操作,一般包含五種類型的Contract:ServiceContract,OperationContract,FaultContract,DataContract,MessageContract。
?
1.ServiceContract
ServiceContract向外部暴漏了可以提供的服務接口,它可以包含服務名稱、命名空間等服務器端的配置信息。
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,以及安全性等。
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。
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信息。
MessageContract則描述了SOAP消息的結構,最終在服務器和客戶端進行傳遞,因此能夠對SOAP信息的Header和Bodies進行直接的訪問和處理,可以對復雜的類型進行處理。
?
為什么需要或者什么時候使用MessageContract
MessageContract一般只在你需要對消息體進行直接控制的時候使用,例如添加特定的Header,Footer等信息。在一些場合,如果需要在消息中包含Session相關的信息時,通過Header進行傳遞,則無需像消息體中增加額外的參數。或者有時你需要提供一個自定義的安全協議或者在應用間傳遞身份令牌。
當然,使用MessageContract時需要從SOAP Header中檢索信息,而不是直接序列化后進行處理。
?
不要混用MessageContract和DataContract
對于一個OperationContract來說,不要在參數和返回值中分別使用MessageContract和DataContract,否則在生成WSDL時會引起運行時錯誤。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
