WCF分布式開發(fā)步步為贏(10)請求應(yīng)答(Request-Reply)、單向操作One_第1頁
WCF分布式開發(fā)步步為贏(10)請求應(yīng)答(Request-Reply)、單向操作One_第2頁
WCF分布式開發(fā)步步為贏(10)請求應(yīng)答(Request-Reply)、單向操作One_第3頁
WCF分布式開發(fā)步步為贏(10)請求應(yīng)答(Request-Reply)、單向操作One_第4頁
WCF分布式開發(fā)步步為贏(10)請求應(yīng)答(Request-Reply)、單向操作One_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 HYPERLINK /frank_xl/archive/2009/05/05/1437494.html WCF分分布式開開發(fā)步步步為贏(10):請求求應(yīng)答(Request-Reply)、單向操作(One-Way)、回調(diào)操作(Call Back).所屬分類類: HYPERLINK /frank_xl/category/176067.html WCCF分布布式開發(fā)發(fā)步步為為贏, HYPERLINK /frank_xl/category/176071.html SOAA annd EEAI WCFF除了支支持經(jīng)典典的請求求應(yīng)答(Request-Reply)模式外,還提供了什么操作調(diào)用模式,他們有什

2、么不同以及我們?nèi)绾卧陂_發(fā)中使用這些操作調(diào)用模式。今天本節(jié)文章里會詳細(xì)介紹。WCF分布式開發(fā)步步為贏(10):請求應(yīng)答(Request-Reply)、單向操作(One-Way)、回調(diào)操作(Call Back).本文結(jié)構(gòu):【1】請求應(yīng)答(Request-Reply)、【2】單向操作(One-Way)、【3】回調(diào)操作(Call Back)、【4】示例代碼分析、【5】總結(jié)。最后上傳本文的示例代碼。 WCFF除了支支持經(jīng)典典的請求求/應(yīng)答模模式意外外,還提提供了對對單向操操作、雙雙向回調(diào)調(diào)操作模模式的支支持,此此外還有有流操作作(后者者與WSSE3.0提供供的優(yōu)化化傳輸機(jī)機(jī)制類似似,我曾曾經(jīng)在這這個文章

3、章里進(jìn)行行過講解解 HYPERLINK /frank_xl/archive/2009/03/11/1408173.html WSEE3.00構(gòu)建Weeb服務(wù)務(wù)安全(4):MTOOM消息息傳輸優(yōu)優(yōu)化和文文件上傳傳、下載載)。今今天我們們會介紹紹幾種操操作調(diào)用用模式的的概念,區(qū)區(qū)別,實實現(xiàn)機(jī)制制,以及及如何在在代碼中中實現(xiàn)他他們,最最后給出出的要注注意的細(xì)細(xì)節(jié)問題題?!?】請請求應(yīng)答答(Reequeest-Repply): 請求應(yīng)應(yīng)答模式式是默認(rèn)認(rèn)的操作作模式。這與經(jīng)經(jīng)典的CC/S編編程類似似,客戶戶端發(fā)送送請求,阻阻塞客戶戶端進(jìn)程程,服務(wù)務(wù)端返回回操作結(jié)結(jié)果。請請求應(yīng)答答模式與與綁定對對應(yīng)關(guān)系系

4、:綁定協(xié)議議名稱支支持可靠靠性 默認(rèn)認(rèn)可靠性性 支支持有序序傳遞 請求應(yīng)應(yīng)答模式式BasiicHtttpBBinddingg Noo N/AA NNoYees NetTTcpBBinddingg YeesOfff YessYess NetPPeerrTcppBinndinngNo N/AA Noo Noo NetNNameedPiipeBBinddingg Noo N/A (On) YYesYYes WSHtttpBBinddingg YessOfff YYes YYes WSFeederratiionHHttppBinndinng YeesOfff Yees Yees WSDuualHHtt

5、ppBinndinng Yees Onn YessYess NetMMsmqqBinndinng No N/AANNoNNo MsmqqInttegrratiionBBinddinggNooN/AA NNo YYes 除了NeetPeeerTTcpBBinddingg和NettMsmmqBiindiing綁綁定,所所有的綁綁定均支支持請求求-應(yīng)答操操作。【2】單單向操作作(Onne-WWay):【2.11】概念念: 簡單來來說,單單向操作作沒有返返回值,客客戶端只只管調(diào)用用,不管管結(jié)果。單向操操作客戶戶端一旦旦發(fā)出請請求,WWCF會會生成一一個請求求,不會會給客戶戶端返回回任何消消息。單單向操

6、作作不同于于異步操操作,雖雖然單向向操作只只是在發(fā)發(fā)出調(diào)用用的瞬間間阻塞客客戶端,但但如果發(fā)發(fā)出多個個單向調(diào)調(diào)用,WWCF會會將請求求調(diào)用放放入隊列列,并在在某個時時候執(zhí)行行。隊列列存儲調(diào)調(diào)用的個個數(shù)是有有限的,一一旦發(fā)出出的調(diào)用用個數(shù)超超出了隊隊列存儲儲調(diào)用的的設(shè)置值值,則會會發(fā)生阻阻塞現(xiàn)象象,因為為調(diào)用無無法放入入隊列。當(dāng)隊列列的請求求出列后后,產(chǎn)生生阻塞的的調(diào)用就就會放入入隊列,并并解除對對客戶端端的阻塞塞。綁定定協(xié)議與與單向請請求模式式關(guān)系:綁定協(xié)協(xié)議名稱稱支持可可靠性 默默認(rèn)可靠靠性 支持有有序傳遞遞 單向向模式BassicHHttppBinndinng NNo N/A NoYYes

7、 NettTcppBinndinng YYesOOff YeesYees NettPeeerTccpBiindiingNoo N/A NNoYYes NettNammedPPipeeBinndinng NNo NN/A (Onn) YessYess WSHHttppBinndinng YeesOfff Yess Yess WSFFedeerattionnHtttpBiindiing YYesOOff YYes YYes WSDDuallHtttpBiindiing YYes OOn YeesYees NettMsmmqBiindiing Noo N/ANoYess MMsmqqInttegrr

8、atiionBBinddinggNooN/AA NNo YYes 和請求應(yīng)應(yīng)答模式式不同。所有的的WCFF綁定通通信協(xié)議議都支持持單向操操作?!?.22】實現(xiàn)現(xiàn)方式: 配置置單向操操作的方方式也很很簡單,WCF的OperationContract定義了IsOneWay屬性。我們設(shè)置設(shè)置單向操作的方法是利用OperationContract特性的IsOneWay屬性,例如:/操作契契約,單調(diào)操操作,不不返回應(yīng)應(yīng)答消息息,會話服服務(wù)中,保保證是最最后一個個操作OOperratiionCConttracct(IIsOnneWaay=ttruee,IssIniitiaatinng=ffalsse,II

9、sTeermiinattingg=trrue)/vvoiddSaayHeelloo2(sstriingnamme); 單向操操作配置置的屬性性定義在在操作契契約級別別上。而而不是用用在服務(wù)務(wù)契約級級別?!?.33】單向向操作小小節(jié):(1)被被設(shè)置為為單向操操作的方方法不能能包含返返回值,即即它的返返回值只只能為vvoidd,否則則會拋出出InvvaliidOpperaatioonExxcepptioon異常常。(2)在會會話契約約中雖然然允許定定義單向向操作(ServiceContract( SessionMode =SessionMode.Required, Namespace = /fra

10、nk_xl/)),但由于單向操作服務(wù)端管理客戶端會話狀態(tài)十分困難,因而,單向操作的最佳適用場景是在單調(diào)服務(wù)或單例服務(wù)中。如果在會話契約中定義了單向操作,就必須保證單向操作是終止會話的最后一個操作,返回void類型值。這可以通過分步操作來實現(xiàn)。代碼如下:/11.單向向服務(wù)契契約,會話服服務(wù)SerrvicceCoontrractt(SSesssionnModde=SesssioonMoode.Reqquirred,Naamesspacce=hhttpp:/m/frrankk_xll/)ppubllicintterffaceeIWCCFSeerviiceOOneWWay/操作作契約,單調(diào)操操作,不不

11、返回應(yīng)應(yīng)答消息息,會話服服務(wù)中,保保證是最最后一個個操作OOperratiionCConttracct(IIsOnneWaay=ttruee,IssIniitiaatinng=ffalsse,IIsTeermiinattingg=trrue)/vvoiddSaayHeelloo2(sstriingnamme);/操作作契約,OperationContractstringSayHello1(stringname);(3)如如果因為為通信(地地址宿主主)問題題,調(diào)用用操作失失敗,單單向操作作如果拋拋出異常常;客戶戶端受服服務(wù)端異異常影響響,取決決于實例例模式以以及使用用綁定?!?】回回調(diào)操作作(C

12、aall Bacck):【3.11】概念念: 回調(diào)不不是一個個新的概概念,早早在C語言里里就有過過,C#里更是是有委托托實現(xiàn)回回調(diào)機(jī)制制。軟件件模塊之之間總是是存在著著一定的的接口,從從調(diào)用方方式上,可可以把他他們分為為三類:同步調(diào)調(diào)用、回回調(diào)和異異步調(diào)用用。同步步調(diào)用是是一種阻阻塞式調(diào)調(diào)用,調(diào)調(diào)用方要要等待對對方執(zhí)行行完畢才才返回,它它是一種種單向調(diào)調(diào)用;回回調(diào)是一一種雙向向調(diào)用模模式,也也就是說說,被調(diào)調(diào)用方在在接口被被調(diào)用時時也會調(diào)調(diào)用對方方的接口口;異步步調(diào)用是是一種類類似消息息或事件件的機(jī)制制,不過過它的調(diào)調(diào)用方向向剛好相相反,接接口的服服務(wù)在收收到某種種訊息或發(fā)發(fā)生某種種事件時時,

13、會主主動通知知客戶方方(即調(diào)調(diào)用客戶戶方的接接口)。回調(diào)和和異步調(diào)調(diào)用的關(guān)關(guān)系非常常緊密,通通常我們們使用回回調(diào)來實實現(xiàn)異步步消息的的注冊,通通過異步步調(diào)用來來實現(xiàn)消消息的通通知。同同步調(diào)用用是三者者當(dāng)中最最簡單的的,而回回調(diào)又常常常是異異步調(diào)用用的基礎(chǔ)礎(chǔ),因此此,下面面我們著著重討論論回調(diào)機(jī)機(jī)制在WWCF軟軟件架構(gòu)構(gòu)中的實實現(xiàn)?;鼗卣{(diào)機(jī)制制如圖所所示:并非所所有的綁綁定協(xié)議議都支持持回調(diào),http本質(zhì)上是無連接的協(xié)議,TCP/IP協(xié)議才會在客戶端和服務(wù)端維持通信信道。兩者之間的對應(yīng)關(guān)系如下:綁定協(xié)協(xié)議名稱稱支持可可靠性 默默認(rèn)可靠靠性 支持有有序傳遞遞 回調(diào)調(diào)模式BassicHHttppBi

14、nndinng NNo N/A NoNNo NettTcppBinndinng YYesOOff YeesYees NettPeeerTccpBiindiingNoo N/A NNoNNo NettNammedPPipeeBinndinng NNo NN/A (Onn) YessYess WSHHttppBinndinng YeesOfff YessNo WSFFedeerattionnHtttpBiindiing YYesOOff YYesNNo WSDDuallHtttpBiindiing YYes OOn YeesYees NettMsmmqBiindiing Noo N/ANoNo M

15、MsmqqInttegrratiionBBinddinggNooN/AA NNo NNo BassicHHttppBinndinng,WSHHttppBinndinng綁定定協(xié)議不不支持回回調(diào)操作作。NeetTccpBiindiing和和NettNammedPPipeeBinndinng綁定定支持回回調(diào)操作作;具有有可靠消消息傳輸輸?shù)腤SSDuaalHtttpBBinddingg綁定是是通過設(shè)設(shè)置兩個個HTTTP信道道來支持持雙向通通信。【3.2】實實現(xiàn)代碼碼: 一個個服務(wù)契契約只能能包含一一個回調(diào)調(diào)契約。通過SServviceeConntraact特特性,可可以指定定回調(diào)契契約:/00.回調(diào)

16、調(diào)服務(wù)契契約,由由于回調(diào)調(diào)方法在在客戶端端執(zhí)行,因因此無須須添加SerrvicceCoontrracttAtttribbutee。對于于回調(diào)操操作,服服務(wù)器無無須獲取取其返回回信息,因因此添加加IsOOneWWay=truue特特性參數(shù)數(shù)。ppubllicintterffaceeIWCCFSeerviiceCCalllBacck/操作作契約OOperratiionCConttracct(IsOOneWWay=truue)/voiidSayyHellloCCallllBaack();/1.服務(wù)契契約,指定SesssioonMoode和回調(diào)調(diào)類型。SServviceeConntraact(Sess

17、sioonMoode=SSesssionnModde.RRequuireed,CCalllbacckCoontrractt=typpeoff(IWWCFSServviceeCalllBaack)pubbliccintterffaceeIWCCFSeerviice/操作作契約,OperationContractstringSayHelloToUser(stringname); 回調(diào)契契約無須須標(biāo)記SServviceeConntraact特特性,但但是在回回調(diào)契約約中必須須為服務(wù)務(wù)的操作作標(biāo)記OOperratiionCConttracct特性性。在導(dǎo)導(dǎo)入回調(diào)調(diào)契約的的元數(shù)據(jù)據(jù)中,回回調(diào)契約約以Ca

18、allbbackk結(jié)尾。服務(wù)端端反序列列化本地地代碼的的時候會會生成客客戶端回回調(diào)操作作契約CCalllbacck后綴綴?!?.33】回調(diào)調(diào)小節(jié):(1)如果果使用了了回調(diào)契契約,回回調(diào)契約約不需要要SerrvicceCoontrractt特性,設(shè)設(shè)置為回回調(diào)契約約就默認(rèn)認(rèn)了服務(wù)務(wù)契約的的特性。(2)客戶戶端通過過回調(diào)傳傳遞給服服務(wù)端的的消息包包含了回回調(diào)契約約終結(jié)點點的引用用。在服服務(wù)端,可可以通過過OpeerattionnConntexxt類的的泛型方方法GeetCaallbbackkChaanneel()獲得。代碼如如下:/獲取客客戶端通通道實例例IIWCFFSerrvicceCaallB

19、Backkcaallbbackk=OpeerattionnConntexxt.CCurrrentt.GeetCaallbbackkChaanneel();【4】示示例代碼碼分析: 直接看概概念還不不能很好好的理解解回調(diào)的的機(jī)制,下下面我們們來具體體看看WWCF里里如何實實現(xiàn)回調(diào)調(diào)??蛻魬舳苏{(diào)用用服務(wù)操操作,服服務(wù)操作作通過客客戶端上上下文實實例調(diào)用用客戶端端操作,這這是回調(diào)調(diào)操作的的基本過過程。一一下是具具體的代代碼實現(xiàn)現(xiàn)講解過過程。這這里只介介紹回調(diào)調(diào)操作的的具體實實現(xiàn)代碼碼。單向向操作過過于簡單單,注釋釋也比較較詳細(xì),大大家可以以參考上上傳的代代碼?!?.11】服務(wù)務(wù)端: 定義義一個回回調(diào)

20、契約約IWCCFSeerviiceCCalllBacck,服服務(wù)契約約IWCCFSeerviice、服務(wù)類類WCFFSerrvicce : IWWCFSServvicee繼承服服務(wù)契約約。代碼碼如下:/11.回調(diào)調(diào)服務(wù)契契約,由由于回調(diào)調(diào)方法在在客戶端端執(zhí)行,因因此無須須添加SerrvicceCoontrracttAtttribbutee。對于于回調(diào)操操作,服服務(wù)器無無須獲取取其返回回信息,因因此添加加IsOOneWWay=truue特特性參數(shù)數(shù)。ppubllicintterffaceeIWCCFSeerviiceCCalllBacck/操作作契約OOperratiionCConttracct

21、()/vvoiddSayyHellloCCallllBaack();/2.服務(wù)契契約,指定CalllbaackCConttracct回調(diào)契契約。SeerviiceCConttracct(CCalllbacckCoontrractt=typpeoff(IWWCFSServviceeCalllBaack)pubbliccintterffaceeIWCCFSeerviice/操作作契約,OperationContractstringSayHelloToUser(stringname);/3.服務(wù)類,繼承接口。實現(xiàn)服務(wù)契約定義的操作publicclassWCFService:IWCFService/獲

22、取當(dāng)前操作客戶端對象實例IWCFServiceCallBackcallback=OperationContext.Current.GetCallbackChannel();/實現(xiàn)接口定義的方法publicstringSayHelloToUser(stringname)/Actioninvoke=delegate(IWCFServiceCallBackcallBack)/callBack.SayHelloCalllBack();/callback(invoke);Console.WriteLine(Hello!0,name);callback.SayHelloCalllBack();return

23、Hello!+name; 服服務(wù)端獲取當(dāng)當(dāng)前操作作客戶端端對象實實例 IWCCFSeerviiceCCalllBacck ccalllbacck = OpperaatioonCoonteext.Currrennt.GGetCCalllbacckChhannnel();ccalllbacck.SSayHHellloCaallllBacck();執(zhí)行行回調(diào)客客戶端當(dāng)當(dāng)前實例例方法。【4.22】宿主主: 宿主主啟動和和綁定節(jié)節(jié)點配置置和前面面幾節(jié)講講解的配配置過程程類似。這里配配置的協(xié)協(xié)議是TTCP。配置文文件代碼碼如下:【4.33】客戶戶端: 運行服服務(wù)托管管宿主,客客戶端添添加服務(wù)務(wù)引用,反反序

24、列化化服務(wù)元元數(shù)據(jù),如如圖: 修改客客戶端代代碼,重重新實現(xiàn)現(xiàn)回調(diào)契契約的操操作方法法,如下下:Syysteem.CCodeeDomm.Coompiilerr.GeenerrateedCoodeAAttrribuute(Syysteem.SServviceeModdel,0)puubliicclaassWCFFSerrvicceCaallbbackk:IWCCFSeerviiceCCalllbacckppubllicvoiidSayyHellloCCallllBaack()Coonsoole.WriiteLLinee(CllienntmmethhodisCalllBaackii

25、ng); 測試試回調(diào)代代碼,我我們實例例化一個個回調(diào)類類的實例例,然后后作為上上下文實實例的參參數(shù)。最最后把上上下文作作為參數(shù)數(shù)實例化化一個客客戶端代代理。具具體代碼碼如下:/CaallBBackk回調(diào)服服務(wù)Coonsoole.WriiteLLinee(CaallBacckOOperratiionTesst);WCCFCllienntCaallBBackk.IWWCFSServviceeCalllbaackcalllBaack=nnewWCFFCliienttCalllBaack.WCFFSerrvicceCaallbbackk();InsstannceCConttexttcoonteext=

26、nnewInsstannceCConttextt(caallBBackk);WWCFCClieentCCalllBacck.WWCFSServviceeCliienttWCCFSeerviiceCCalllBacckCllienntPrroxyy=newwWCCFCllienntCaallBBackk.WCCFSeerviiceCClieent(conntexxt,NeetTccpBiindiing_IWCCFSeerviice);/通過代代理調(diào)用用調(diào)用SSayHHellloTooUseer,傳遞對對象Coonsoole.WriiteLLinee(WCCFSeerviiceCCalllBacc

27、kCllienntPrroxyy.SaayHeellooToUUserr(FFrannkXXuLLeiCalllBBackk);【4.44】運行行結(jié)果: 這里的的運行結(jié)結(jié)果包括括單向操操作和回回調(diào)操作作結(jié)果,客客戶端調(diào)調(diào)用一個個服務(wù)操操作,服服務(wù)操作作再通過過客戶端端上下文文實例引引用調(diào)用用客戶端端操作。成功執(zhí)執(zhí)行回調(diào)調(diào)操作。結(jié)果如如圖:【5】總總結(jié):(1)服務(wù)對對回調(diào)的的調(diào)用可可能會產(chǎn)產(chǎn)生死鎖鎖。就是是指當(dāng)回回調(diào)的應(yīng)應(yīng)答消息息也需要要獲得與與服務(wù)實實例關(guān)聯(lián)聯(lián)的相同同的鎖時時,會導(dǎo)導(dǎo)致死鎖鎖。此時時服務(wù)線線程已經(jīng)經(jīng)被阻塞塞,服務(wù)務(wù)操作正正在等待待回調(diào)操操作執(zhí)行行完畢,而而回調(diào)操操作卻又又在等待

28、待服務(wù)釋釋放鎖。解決死死鎖的辦辦法:將將服務(wù)配配置為允允許多線線程訪問問,會增增加服務(wù)務(wù)開發(fā)者者負(fù)擔(dān)。將將回調(diào)設(shè)設(shè)置為重重入(RReenntraancyy) /3.服服務(wù)類,繼繼承接口口。實現(xiàn)現(xiàn)服務(wù)契契約定義義的操作作 SServviceeBehhaviior(ConncurrrenncyMModee=ConncurrrenncyMModee.Reeenttrannt) puubliic cclasss WWCFSServvicee : IWCCFSeerviice . 。所所謂“重入”,是指指對同步步域擁有有獨占訪訪問權(quán)的的線程AA調(diào)用了了同步域域之外對對象的方方法,此此時,另另外的線線程B若要訪訪問該同同步域,則則線程AA將釋放放對同步步域的鎖鎖,允許許線程BB進(jìn)入。直到線線程B執(zhí)行完完畢并釋釋放對同同步域的的鎖后,線線程A將重新新進(jìn)入該該同步域域。由于于服務(wù)被被配置為為重入,則服務(wù)調(diào)用回調(diào)引用時會釋放鎖。然后將回調(diào)返回給客戶端,控制權(quán)則返回給服務(wù),服務(wù)會重入并重新獲取鎖。將回調(diào)操作設(shè)置為單向操作( OperationContract(IsOneWay=true)/void SayHelloCalllBack();)。此時,回調(diào)調(diào)用不會產(chǎn)生應(yīng)答消息,服務(wù)操作一旦執(zhí)行了回調(diào)操作,就會繼續(xù)執(zhí)行,回調(diào)對象不會爭用與服務(wù)實例關(guān)聯(lián)的鎖,從而解決了死鎖問題

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論