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

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