日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

WCF入门到精通(二)——契约

發(fā)布時(shí)間:2023/12/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WCF入门到精通(二)——契约 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第一次接觸WCF,如有寫(xiě)的不對(duì)的地方有望大家指出來(lái),謝謝!!

本篇文章主要說(shuō)下WCF中的契約的種類(lèi)、契約的種類(lèi)、如何定義契約等內(nèi)容。

?????? 契約是一種雙邊或多邊的協(xié)議,是利益相關(guān)方就某個(gè)問(wèn)題達(dá)成的一種共識(shí),契約確保了服務(wù)的正常調(diào)用,客戶(hù)端以契約的方式進(jìn)行服務(wù)調(diào)用,而服務(wù)則需要照契約規(guī)定的方式提供服務(wù)。契約是服務(wù)提供的一組操作的描述,從功能上講每個(gè)操作對(duì)應(yīng)著某個(gè)具體的功能實(shí)現(xiàn),以及調(diào)用這個(gè)操作的輸入和輸出;從消息交換層面上講,每個(gè)操作定義了所采用的消息交換模式和消息本身的結(jié)構(gòu)。

主要內(nèi)容:

??? 1.什么是契約?

??? 2.契約有幾種?他們都有什么用途

??? 3.如何定義契約?

??? 4.契約是獨(dú)立于平臺(tái)的么?

??? 5.契約和以往哪種技術(shù)比較想像,又有什么不同

一、什么是契約?

? 任何一個(gè)分布式應(yīng)用程序,它之所以能夠互相傳遞消息,都是事先制定好數(shù)據(jù)交換規(guī)則的,這個(gè)規(guī)則正是交換數(shù)據(jù)的雙方(比如服務(wù)器端和客戶(hù)端)能彼此理解對(duì)方 的依據(jù),WCF作為分布式開(kāi)發(fā)技術(shù)的一種,同樣具有這樣一種特性。而在WCF中制定的的規(guī)則就被稱(chēng)之為契約(Contract),它是WCF的消息標(biāo)準(zhǔn), 是任何一個(gè)wcf程序不可或缺的一部分。

二、契約的種類(lèi)

?在WCF中,契約分為四種,它們分別為:

?? 1.服務(wù)契約

???? 服務(wù)契約描述了暴露給外部的類(lèi)型(接口或類(lèi))、服務(wù)所支持的操作、使用的消息交換模式和消息的格式。每個(gè)WCF服務(wù)必須實(shí)現(xiàn)至少一個(gè)服務(wù)契約。使用服務(wù)契約必須要引用命名空間System.ServiceModel 。服務(wù)契約中常用到的三個(gè)特性:

? ServiceContractAttribute

?

??? 該特性定義在類(lèi)或接口上,用來(lái)描述一個(gè)相關(guān)操作的集合。ServiceContractAttribute特性還有如下的一些屬性值可以設(shè)置:

?

??? Name:給服務(wù)契約定義一個(gè)名稱(chēng),而不是使用接口或是類(lèi)的類(lèi)型名,在客戶(hù)端添加服務(wù)引用時(shí)會(huì)用到。

?

??? Namespace:命名空間,默認(rèn)值為http://tempuri.org。

?

??? CallbackContract:將另一個(gè)服務(wù)契約定義為回調(diào)契約,使得客戶(hù)端可以接收服務(wù)端的異步消息。

?

??? ProtectionLevel:控制契約中發(fā)送給消息的保護(hù)方式是否需要被簽名和加密。該屬性為?? System.Net.Security.ProtectionLevel枚舉類(lèi)型。

?

???? SessionMode:確定會(huì)話(huà)是否為公開(kāi)服務(wù)契約的端點(diǎn)所支持。

?

???? ConfigurationName:服務(wù)的配置名稱(chēng)。

?

[ServiceContract(Name="HelloWorld",Namespace="http://oec2003.cnblogs.com"] public interface IHelloWorldService { }

OperationContractAttribute

?? 用OperationContractAttribute標(biāo)記的方法即為一個(gè)服務(wù)操作,簡(jiǎn)單的使用該特性就可以讓一個(gè)方法加入到服務(wù)契約的操作隊(duì)列中,可以被客戶(hù)端所調(diào)用。該特性也有一些設(shè)置消息交換方式的屬性。如下

?? Name:定義一個(gè)操作名稱(chēng),而不是使用方法名稱(chēng)。

?? Action:該操作消息的動(dòng)作標(biāo)題。

?? ReplyAction:響應(yīng)該操作消息的動(dòng)作標(biāo)題。

?? IsOneWay:設(shè)置該操作是否單向和沒(méi)有回復(fù),如果操作是單向的,將不支持ReplyAction。

?? ProtectionLevel:允許你控制特定的操作消息是否被保護(hù),操作中的ProtectionLevel屬性將覆蓋服務(wù)契約中的ProtectionLevel。該屬性為System.Net.Security.ProtectionLevel枚舉類(lèi)型。

?? IsInitiating:操作是否可以用來(lái)初始化會(huì)話(huà)。

?? IsTerminating:操作是否中止一個(gè)會(huì)話(huà)。

?? AsyncPattern:將服務(wù)操作定義為異步實(shí)現(xiàn)模式。

[ServiceContract(Namespace="http://oec2003.cnblogs.com",Name="oec2003",ConfigurationName="IHelloWorldService")] public interface IHelloWorldService {[OperationContract(Name="oec2003SayHello",Action = "http://oec2003.cnblogs.com/IHelloWorldService/Hello",ReplyAction = "http://oec2003.cnblogs.com/IHelloWorldService/HelloReply")]string SayHello(); }
??? MessageParameterAttribute

?? 使用 MessageParameterAttribute 可以控制參數(shù)或返回值的名稱(chēng)。此屬性對(duì)于已用 MessageContractAttribute 特性標(biāo)記的參數(shù)無(wú)效。該特性只有一個(gè)Name屬性,看如下代碼:

[ServiceContract(Namespace="http://oec2003.cnblogs.com",Name="oec2003",ConfigurationName="IHelloWorldService")] public interface IHelloWorldService {[OperationContract][return: MessageParameter(Name = "responseString")]string SayHello([MessageParameter(Name = "string")]string meg); }

?2.數(shù)據(jù)契約

?

使用數(shù)據(jù)契約必須引用System.Runtime.Serialization命名空間,在類(lèi)型上使用DataContractAttribute可以創(chuàng)建數(shù)據(jù)契約,類(lèi)型中的成員使用DataMember標(biāo)記。代碼如下:

[DataContract] public class User {[DataMember]public int Age { get; set; }[DataMember]public string Name { get; set; }[DataMember]public string Email { get; set; } }
DataContractAttribute

DataContractAttribute特性定義在類(lèi)型之上,類(lèi)型包括類(lèi)、結(jié)構(gòu)、枚舉但不包括接口。 DataContractAttribute特性不能被繼承,即繼承自有DataContractAttribute特性標(biāo)記的類(lèi)并不是數(shù)據(jù)契約,必須顯 示使用DataContractAttribute標(biāo)記才能成為數(shù)據(jù)契約。DataContractAttribute特性有IsReference、 Name和Namespace三個(gè)屬性:

IsReference:bool類(lèi)型,表示在進(jìn)行序列化的時(shí)候是否保持對(duì)象現(xiàn)有的引用結(jié)構(gòu)。

Name:名稱(chēng)。

Namespace:命名空間。

[DataContract(IsReference=true,Name="MyUser",Namespace="http://oec2003.cnblogs.com")] public class User {[DataMember]public int Age { get; set; }[DataMember]public string Name { get; set; }[DataMember]public string Email { get; set; } }
DataMemberAttribute

使用DataMemberAttribute標(biāo)記的類(lèi)型成員才能成為數(shù)據(jù)契約的數(shù)據(jù)成員。這個(gè)和服務(wù)契約中的OperationContractAttribute類(lèi)似。DataMemberAttribute特性有如下四個(gè)屬性:

EmitDefaultValue:表明在數(shù)據(jù)成員的值等于默認(rèn)值的情況下,是否還須要將其序列化到最終的XML中,默認(rèn)值為true,表示默認(rèn)值會(huì)參與序列化。

IsRequired:bool類(lèi)型,表明屬性成員是否是必須的成員,默認(rèn)值為false。

Name:數(shù)據(jù)成員的別名。

Order:相應(yīng)的數(shù)據(jù)成員在最終序列化的XML中出現(xiàn)的位置,默認(rèn)是按字母順序排列的。

[DataContract(IsReference=true,Name="MyUser",Namespace="http://oec2003.cnblogs.com")] public class User {[DataMember(EmitDefaultValue=true,IsRequired=true,Name="Oec2003_Age",Order=1)]public int Age { get; set; }[DataMember(EmitDefaultValue = true, IsRequired = true, Name = "Oec2003_Name", Order = 2)]public string Name { get; set; }[DataMember(EmitDefaultValue = true, IsRequired = false, Name = "Oec2003_Email", Order = 3)]public string Email { get; set; }

3.消息契約

使用消息契約必須引用System.ServiceModel命名空間,消息契約和數(shù)據(jù)契約一樣都是定義在數(shù)據(jù)類(lèi)型上。和數(shù)據(jù)契約不同的是消息契約 更多的是關(guān)注數(shù)據(jù)成員在SOAP消息中的表示。定義一個(gè)消息契約需要用到MessageContractAttribute特性,另外還涉及到 MessageHeaderAttribute和MessageBodyMemberAttribute這兩個(gè)特 性,MessageContractAttribute特性標(biāo)記在類(lèi)型上,MessageHeaderAttribute和 MessageBodyMemberAttribute特性標(biāo)記在數(shù)據(jù)成員上。

[MessageContract] public class MessageTest {[MessageHeader]public int Age { get; set; }[MessageHeader]public string Name { get; set; }[MessageBodyMember]public string Email { get; set; } }
MessageContractAttribute

通過(guò)在一個(gè)類(lèi)型上使用MessageContractAttribute標(biāo)記可以使之成為一個(gè)消息契約。MessageContractAttribute特性含有如下幾個(gè)屬性:

IsWrapped:是否為定義的主體成員(一個(gè)或者多個(gè))添加一個(gè)額外的根節(jié)點(diǎn)。

WrapperName:根節(jié)點(diǎn)的名稱(chēng)。

WrapperNamespace:根節(jié)點(diǎn)的命名空間。

ProtectionLevel:表示保護(hù)級(jí)別,WCF中通過(guò)System.Net.Security.ProtectionLevel枚舉定義消息的保護(hù)級(jí)別。一般有3種可選的保護(hù)級(jí)別:None、Sign和EncryptAndSign。

[MessageContract(IsWrapped=false,WrapperName="MyMessage",WrapperNamespace="http://oec2003.com")] public class MessageTest {//省略 }
MessageHeaderAttribute

?

使用MessageHeaderAttribute標(biāo)記的數(shù)據(jù)成員將會(huì)出現(xiàn)在SOAP消息的頭部,該特性包含下面幾個(gè)屬性:

Actor:為一個(gè)URI值,表示處理該報(bào)頭的目標(biāo)節(jié)點(diǎn)。

MustUnderstand:bool類(lèi)型,表明Actor定義的節(jié)點(diǎn)是否必須理解并處理該節(jié)點(diǎn)。

Name:名稱(chēng)。

Namespace:命名空間。

ProtectionLevel:表示保護(hù)級(jí)別。

Relay:表明該報(bào)頭是否需要傳遞到下一個(gè)SOAP節(jié)點(diǎn)。

[MessageContract] public class MessageTest {[MessageHeader(Actor="http://oec2003.com/Age",MustUnderstand=true,Name="MyAge",Namespace="http://oec2003.com",Relay=true)]public int Age { get; set; }[MessageHeader]public string Name { get; set; } }
MessageBodyMemberAttribute

使用MessageHeaderAttribute標(biāo)記的數(shù)據(jù)成員將會(huì)出現(xiàn)在SOAP消息的主體部分,該特性包含下面的屬性:

Order:Order屬性用來(lái)控制成員在SOAP主體部分中出現(xiàn)的位置,默認(rèn)按字母順序排列。

Name:名稱(chēng)。

Namespace:命名空間。

ProtectionLevel:表示保護(hù)級(jí)別。

[MessageContract(IsWrapped=false,WrapperName="MyMessage",WrapperNamespace="http://oec2003.com")] public class MessageTest {[MessageBodyMember(Order = 1)]public string Email { get; set; } }

二、如何定義契約?

可參考資料

http://www.cnblogs.com/artech/archive/2007/02/28/659331.html

http://www.rainsts.net/article.asp?id=427

http://www.rainsts.net/article.asp?id=429

http://www.rainsts.net/article.asp?id=430

?

?

?? 三、契約是獨(dú)立于平臺(tái)的么?

?

??? WCF作為一種能夠跨平臺(tái)的體系框架,其應(yīng)用肯定會(huì)有異構(gòu),異網(wǎng)的情況發(fā)生,那么作為通訊依據(jù)的契約能否自動(dòng)適用于上述情況呢?答案是肯定的,契約是獨(dú)立 于平臺(tái)之外的,它只約束通訊的雙方應(yīng)該遵守什么樣的規(guī)則,而絲毫不管雙方各自采用的是什么樣的技術(shù)和什么樣的操作系統(tǒng),也只有這樣,WCF才能有真正的生 命力。

?

?

?

四、契約和以往哪種技術(shù)比較相像,又有什么不同?

????如果非要拿契約和以往的技術(shù)相比較 的話(huà),契約和asp.net xml web service的聲明性編程模型甚是相似,比如在web service中在類(lèi)上標(biāo)記WebServiceAttribute便可以將此類(lèi)用于遠(yuǎn)程調(diào)用,而將方法添加WebMethondAttribute也可 以將其暴露給遠(yuǎn)程客戶(hù)端,這和WCF中的ServiceContract和OperationContract簡(jiǎn)直如出一轍,但不同的是,WCF中的契約 要比Xml Web Service中的要詳盡的多,比如ServiceContract和OperationContract可以直接使用在接口上面,而實(shí)現(xiàn)該接口的類(lèi)就繼 承了這種契約聲明,自動(dòng)擁有契約所規(guī)范的動(dòng)作和行為,這就使得程序員更方便的使用面向接口的編程方式,可以使同一服務(wù)擁有不同的實(shí)現(xiàn),在新舊版本升級(jí)的同 時(shí),能夠使新老版本共同運(yùn)行。

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiaowuzi/p/3547341.html

總結(jié)

以上是生活随笔為你收集整理的WCF入门到精通(二)——契约的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。