日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
WCF服務(wù)契約基本應(yīng)用技巧解讀

我們?cè)趹?yīng)用WCF服務(wù)契約的時(shí)候,需要掌握一些應(yīng)用技巧,才能幫助我們輕松的應(yīng)用這一功能來(lái)完成各種功能需求。在這里我們就一起來(lái)看看WCF服務(wù)契約的分解與設(shè)計(jì)方法,以方便大家理解。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),海門企業(yè)網(wǎng)站建設(shè),海門品牌網(wǎng)站建設(shè),網(wǎng)站定制,海門網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,海門網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

C++與C#均支持操作的重載,但在WCF的編程模型中,卻并不支持這種技術(shù)。坦白說(shuō),在WCF的編程模型,對(duì)于面向?qū)ο蟮闹С侄际潜容^弱的,包括后面要介紹的繼承體系與多態(tài),都存在許多問(wèn)題。因此,在服務(wù)端我們不能定義這樣的WCF服務(wù)契約:

 
 
 
  1. [ServiceContract]   
  2. interface ICalculator   
  3. {   
  4. [OperationContract]   
  5. int Add(int arg1,int arg2);   
  6. [OperationContract]   
  7. double Add(double arg1,double arg2);   

雖然在編譯時(shí)能夠通過(guò),然而一旦在裝載宿主時(shí),就會(huì)拋出InvalidOperationException異常。以ICalculator契約為例,WCF會(huì)認(rèn)為是零個(gè)操作。

解決的辦法是利用OperationContract特性的Name屬性,例如:

 
 
 
  1. [ServiceContract]   
  2. interface ICalculator   
  3. {   
  4. [OperationContract(Name = "AddInt")]   
  5. int Add(int arg1,int arg2);   
  6. [OperationContract(Name = "AddDouble")]   
  7. double Add(double arg1,double arg2);   

不過(guò)采用這種方式,存在的問(wèn)題是生成的代理會(huì)將Name屬性指定的名稱作為代理操作的方法名。這對(duì)于編程者而言,并非好的方式。所幸我們可以手動(dòng)對(duì)生成的代理進(jìn)行修改,將它修改為與WCF服務(wù)契約一致的操作名。由于,此時(shí)通過(guò)Name指定了操作的別名,因此,避免了裝載宿主拋出的異常。

契約的繼承

即使父接口標(biāo)記了[ServiceContract],子接口仍然需要標(biāo)記[ServiceContract],因?yàn)镾erviceContractAttribute是不可繼承的。服務(wù)類對(duì)服務(wù)契約的實(shí)現(xiàn),與傳統(tǒng)的C#編程沒(méi)有什么區(qū)別。例如:

 
 
 
  1. [ServiceContract]   
  2. interface ISimpleCalculator   
  3. {   
  4. [OperationContract]   
  5. int Add(int arg1,int arg2);   
  6. }   
  7. [ServiceContract]   
  8. interface IScientificCalculator : ISimpleCalculator   
  9. {   
  10. [OperationContract]   
  11. int Multiply(int arg1,int arg2);   
  12. }   
  13. class MyCalculator : IScientificCalculator   
  14. {   
  15. public int Add(int arg1,int arg2) { return arg1 + arg2;   
  16. }   
  17. public int Multiply(int arg1,int arg2) { return arg1 * arg2;   
  18. }   

公開(kāi)終結(jié)點(diǎn)的時(shí)候,可以對(duì)***層的契約接口公開(kāi)一個(gè)單獨(dú)的終結(jié)點(diǎn):

 
 
 
  1. < service name=”MyCalculator”> < endpoint> < addressaddress=
    ”http://localhost:8001/MyCalculator/”> < bindingbinding=
    ”basicHttpBinding”> < contractcontract=” IScientificCalculator”>
     < /endpoint> < /service>  

客戶端在導(dǎo)入如上的WCF服務(wù)契約時(shí),會(huì)取消服務(wù)契約的繼承層級(jí),并利用OperationContract特性中的Action與ReplyAction屬性,保留原來(lái)定義每個(gè)操作的契約名。但為了使客戶端編程能夠與服務(wù)編程保持一致,***是恢復(fù)客戶端的契約層級(jí)。方法并無(wú)什么太玄妙的地方,無(wú)非就是根據(jù)服務(wù)契約層級(jí)對(duì)客戶端契約進(jìn)行手工修改。修改后的客戶端契約及其代理的定義如下:

 
 
 
  1. [ServiceContract]   
  2. public interface ISimpleCalculator {   
  3. [OperationContract]   
  4. int Add(int arg1,int arg2);   
  5. }   
  6. public partial class SimpleCalculatorClient : ClientBase
    < ISimpleCalculator>, ISimpleCalculator   
  7. {   
  8. public int Add(int arg1,int arg2)   
  9. {   
  10. return Channel.Add(arg1,arg2);   
  11. } //Rest of the proxy }   
  12. [ServiceContract]   
  13. public interface IScientificCalculator : ISimpleCalculator {   
  14. [OperationContract]   
  15. int Multiply(int arg1,int arg2);   
  16. }   
  17. public partial class ScientificCalculatorClient : ClientBase
    < IScientificCalculator>,IScientificCalculator {   
  18. public int Add(int arg1,int arg2) {   
  19. return Channel.Add(arg1,arg2); }   
  20. public int Multiply(int arg1,int arg2) {   
  21. return Channel.Multiply(arg1,arg2); }   
  22. //Rest of the proxy } 

在書(shū)中還提出了所謂的代理鏈(Proxy Chaining)技術(shù),實(shí)質(zhì)上就是使得分別實(shí)現(xiàn)不同層級(jí)接口的代理類形成一個(gè)IS-A的繼承關(guān)系。如上的定義,就可以使ScientificCalculatorClient繼承自SimpleCalculatorClient,而不是繼承ClientBase< IScientificCalculator>:

 
 
 
  1. public partial class SimpleCalculatorClient : 
    ClientBase< IScientificCalculator>, ISimpleCalculator {   
  2. public int Add(int arg1,int arg2) {   
  3. return Channel.Add(arg1,arg2);   
  4. } //Rest of the proxy }   
  5. public class ScientificCalculatorClient : SimpleCalculatorClient, 
    IScientificCalculator {   
  6. public int Multiply(int arg1,int arg2) {   
  7. return Channel.Multiply(arg1,arg2); } //Rest of the proxy } 

只有這樣,如下代碼才是正確的:

 
 
 
  1. SimpleCalculatorClient proxy1 = new SimpleCalculatorClient( );   
  2. SimpleCalculatorClient proxy2 = new ScientificCalculatorClient( );   
  3. ScientificCalculatorClient proxy3 = new ScientificCalculatorClient( ); 

以上就是對(duì)WCF服務(wù)契約的相關(guān)介紹。

【編輯推薦】

  1. WCF限流操作實(shí)際設(shè)置方式揭秘
  2. WCF實(shí)例停用基本應(yīng)用技巧分享
  3. WCF分布操作應(yīng)對(duì)特定操作情況
  4. WCF死鎖三種不同方式介紹
  5. WCF回調(diào)契約如何進(jìn)行正確定義

網(wǎng)頁(yè)名稱:WCF服務(wù)契約基本應(yīng)用技巧解讀
URL標(biāo)題:http://www.5511xx.com/article/dpcccjs.html