WCF中的Contracts
WCF通過Contract來說明服務(wù)和操作,一般包含五種類型的Contract:ServiceContract,OperationContract,F(xiàn)aultContract,DataContract,MessageContract。
?
1.ServiceContract
ServiceContract向外部暴漏了可以提供的服務(wù)接口,它可以包含服務(wù)名稱、命名空間等服務(wù)器端的配置信息。
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的內(nèi)部,定義了具體的服務(wù)操作。在此基礎(chǔ)上,可以對操作的事務(wù),綁定(One-way,Two-way等)和FaultContract信息。
?
1:
[ServiceContract]
2: interface IMyContract
3:
{
4: [FaultContract( typeof (MyFaultContract))]
5:
[OperationContract]
6: string MyMethod();
7:
}
?
3.Data Contract
定義了服務(wù)器和客戶端交互的內(nèi)容,它可以標(biāo)識類,以便作為OperationContract的參數(shù)或者返回類型。
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
當(dāng)OperationContract需要傳遞參數(shù)或者返回值時,可以使用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定義了服務(wù)可能出現(xiàn)的異常信息,以及服務(wù)隊錯誤的處理和錯誤信息拋出到客戶端的內(nèi)容。一個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的比較
區(qū)別
DataContract提供了一種將.net的CLR類型映射為可以被其他應(yīng)用程序識別的基于W3C的Xml的方法,使得不同的應(yīng)用間無須考慮對應(yīng)使用的是什么類型的數(shù)據(jù),而只需關(guān)注這些被抽象的Xml信息。
MessageContract則描述了SOAP消息的結(jié)構(gòu),最終在服務(wù)器和客戶端進行傳遞,因此能夠?qū)OAP信息的Header和Bodies進行直接的訪問和處理,可以對復(fù)雜的類型進行處理。
?
為什么需要或者什么時候使用MessageContract
MessageContract一般只在你需要對消息體進行直接控制的時候使用,例如添加特定的Header,F(xiàn)ooter等信息。在一些場合,如果需要在消息中包含Session相關(guān)的信息時,通過Header進行傳遞,則無需像消息體中增加額外的參數(shù)。或者有時你需要提供一個自定義的安全協(xié)議或者在應(yīng)用間傳遞身份令牌。
當(dāng)然,使用MessageContract時需要從SOAP Header中檢索信息,而不是直接序列化后進行處理。
?
不要混用MessageContract和DataContract
對于一個OperationContract來說,不要在參數(shù)和返回值中分別使用MessageContract和DataContract,否則在生成WSDL時會引起運行時錯誤。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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