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

下載本文檔

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

文檔簡(jiǎn)介

1、.:.; HYPERLINK cnblogs/frank_xl/archive/2021/05/05/1437494.html WCF分布式開發(fā)步步為贏(10):懇求應(yīng)對(duì)Request-Reply、單向操作(One-Way)、回調(diào)操作(Call Back).所屬分類: HYPERLINK cnblogs/frank_xl/category/176067.html WCF分布式開發(fā)步步為贏, HYPERLINK cnblogs/frank_xl/category/176071.html SOA and EAI WCF除了支持經(jīng)典的懇求應(yīng)對(duì)Request-Reply方式外,還提供了什么操作調(diào)用方式

2、,他們有什么不同以及我們?nèi)绾卧陂_發(fā)中運(yùn)用這些操作調(diào)用方式。今天本節(jié)文章里會(huì)詳細(xì)引見。WCF分布式開發(fā)步步為贏(10):懇求應(yīng)對(duì)Request-Reply、單向操作(One-Way)、回調(diào)操作(Call Back).本文構(gòu)造:【1】懇求應(yīng)對(duì)Request-Reply、【2】單向操作(One-Way)、【3】回調(diào)操作(Call Back)、【4】例如代碼分析、【5】總結(jié)。最后上傳本文的例如代碼。 WCF除了支持經(jīng)典的懇求/應(yīng)對(duì)方式不測(cè),還提供了對(duì)單向操作、雙向回調(diào)操作方式的支持,此外還有流操作后者與WSE3.0提供的優(yōu)化傳輸機(jī)制類似,我曾經(jīng)在這個(gè)文章里進(jìn)展過講解 HYPERLINK cnblogs

3、/frank_xl/archive/2021/03/11/1408173.html WSE3.0構(gòu)建Web效力平安(4):MTOM音訊傳輸優(yōu)化和文件上傳、下載 。今天我們會(huì)引見幾種操作調(diào)用方式的概念,區(qū)別,實(shí)現(xiàn)機(jī)制,以及如何在代碼中實(shí)現(xiàn)他們,最后給出的要留意的細(xì)節(jié)問題?!?】懇求應(yīng)對(duì)Request-Reply: 懇求應(yīng)對(duì)方式是默許的操作方式。這與經(jīng)典的C/S編程類似,客戶端發(fā)送懇求,阻塞客戶端進(jìn)程,效力端前往操作結(jié)果。懇求應(yīng)對(duì)方式與綁定對(duì)應(yīng)關(guān)系 :綁定協(xié)議稱號(hào)支持可靠性 默許可靠性 支持有序傳送 懇求應(yīng)對(duì)方式 BasicHttpBinding No N/A NoYes NetTcpBindin

4、g YesOff YesYes NetPeerTcpBindingNo N/A No No NetNamedPipeBinding No N/A (On) YesYes WSHttpBinding YesOff Yes Yes WSFederationHttpBinding YesOff Yes Yes WSDualHttpBinding Yes On YesYes NetMsmqBinding No N/ANoNo MsmqIntegrationBindingNoN/A No Yes 除了NetPeerTcpBinding和NetMsmqBinding綁定,一切的綁定均支持懇求-應(yīng)對(duì)操作。

5、【2】單向操作(One-Way):【2.1】概念: 簡(jiǎn)單來說,單向操作沒有前往值,客戶端雖然調(diào)用,不論結(jié)果。單向操作客戶端一旦發(fā)出懇求,WCF會(huì)生成一個(gè)懇求,不會(huì)給客戶端前往任何音訊。單向操作不同于異步操作,雖然單向操作只是在發(fā)出調(diào)用的瞬間阻塞客戶端,但假設(shè)發(fā)出多個(gè)單向調(diào)用,WCF會(huì)將懇求調(diào)用放入隊(duì)列,并在某個(gè)時(shí)候執(zhí)行。隊(duì)列存儲(chǔ)調(diào)用的個(gè)數(shù)是有限的,一旦發(fā)出的調(diào)用個(gè)數(shù)超出了隊(duì)列存儲(chǔ)調(diào)用的設(shè)置值,那么會(huì)發(fā)生阻塞景象,由于調(diào)用無法放入隊(duì)列。當(dāng)隊(duì)列的懇求出列后,產(chǎn)生阻塞的調(diào)用就會(huì)放入隊(duì)列,并解除對(duì)客戶端的阻塞。綁定協(xié)議與單向懇求方式關(guān)系: 綁定協(xié)議稱號(hào)支持可靠性 默許可靠性 支持有序傳送 單向方式 B

6、asicHttpBinding No N/A NoYes NetTcpBinding YesOff YesYes NetPeerTcpBindingNo N/A NoYes NetNamedPipeBinding No N/A (On) YesYes WSHttpBinding YesOff Yes Yes WSFederationHttpBinding YesOff Yes Yes WSDualHttpBinding Yes On YesYes NetMsmqBinding No N/ANoYes MsmqIntegrationBindingNoN/A No Yes 和懇求應(yīng)對(duì)方式不同。一切

7、的WCF綁定通訊協(xié)議都支持單向操作。 【2.2】實(shí)現(xiàn)方式: 配置單向操作的方式也很簡(jiǎn)單,WCF的OperationContract 定義了IsOneWay屬性。我們?cè)O(shè)置設(shè)置單向操作的方法是利用OperationContract特性的IsOneWay屬性,例如: /操作契約,單調(diào)操作,不前往應(yīng)對(duì)音訊,會(huì)話效力中,保證是最后一個(gè)操作OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)/voidSayHello2(stringname); 單向操作配置的屬性定義在操作契約級(jí)別上。而不是用在效力契約級(jí)別?!?.3】

8、單向操作小節(jié):1被設(shè)置為單向操作的方法不能包含前往值,即它的前往值只能為void,否那么會(huì)拋出InvalidOperationException異常。2在會(huì)話契約中雖然允許定義單向操作ServiceContract( SessionMode =SessionMode.Required, Namespace = cnblogs/frank_xl/),但由于單向操作效力端管理客戶端會(huì)話形狀非常困難,因此,單向操作的最正確適用場(chǎng)景是在單調(diào)效力或單例效力中。假設(shè)在會(huì)話契約中定義了單向操作,就必需保證單向操作是終止會(huì)話的最后一個(gè)操作,前往void類型值。這可以經(jīng)過分步操作來實(shí)現(xiàn)。代碼如下:/1.單向效力

9、契約,會(huì)話效力ServiceContract(SessionMode=SessionMode.Required,Namespace=cnblogs/frank_xl/)publicinterfaceIWCFServiceOneWay/操作契約,單調(diào)操作,不前往應(yīng)對(duì)音訊,會(huì)話效力中,保證是最后一個(gè)操作OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)/voidSayHello2(stringname);/操作契約,OperationContractstringSayHello1(stringname);3假

10、設(shè)由于通訊地址宿主問題,調(diào)用操作失敗,單向操作假設(shè)拋出異常;客戶端受效力端異常影響,取決于實(shí)例方式以及運(yùn)用綁定。 【3】回調(diào)操作(Call Back):【3.1】概念: 回調(diào)不是一個(gè)新的概念,早在C言語里就有過,C#里更是有委托實(shí)現(xiàn)回調(diào)機(jī)制。軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類:同步伐用、回調(diào)和異步伐用。同步伐用是一種阻塞式調(diào)用,調(diào)用方要等待對(duì)方執(zhí)行終了才前往,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用方式,也就是說,被調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口;異步伐用是一種類似音訊或事件的機(jī)制,不過它的調(diào)用方向剛好相反,接口的效力在收到某種訊息或發(fā)生某種事件時(shí),會(huì)自動(dòng)通

11、知客戶方即調(diào)用客戶方的接口?;卣{(diào)和異步伐用的關(guān)系非常嚴(yán)密,通常我們運(yùn)用回調(diào)來實(shí)現(xiàn)異步音訊的注冊(cè),經(jīng)過異步伐用來實(shí)現(xiàn)音訊的通知。同步伐用是三者當(dāng)中最簡(jiǎn)單的,而回調(diào)又經(jīng)常是異步伐用的根底,因此,下面我們著重討論回調(diào)機(jī)制在WCF軟件架構(gòu)中的實(shí)現(xiàn)。回調(diào)機(jī)制如下圖: 并非一切的綁定協(xié)議都支持回調(diào),http本質(zhì)上是無銜接的協(xié)議,TCP/IP協(xié)議才會(huì)在客戶端和效力端維持通訊信道。兩者之間的對(duì)應(yīng)關(guān)系如下: 綁定協(xié)議稱號(hào)支持可靠性 默許可靠性 支持有序傳送 回調(diào)方式 BasicHttpBinding No N/A NoNo NetTcpBinding YesOff YesYes NetPeerTcpBindin

12、gNo N/A NoNo NetNamedPipeBinding No N/A (On) YesYes WSHttpBinding YesOff YesNo WSFederationHttpBinding YesOff YesNo WSDualHttpBinding Yes On YesYes NetMsmqBinding No N/ANoNo MsmqIntegrationBindingNoN/A No No BasicHttpBinding,WSHttpBinding綁定協(xié)議不支持回調(diào)操作。NetTcpBinding和NetNamedPipeBinding綁定支持回調(diào)操作;具有可靠音訊傳輸

13、的WSDualHttpBinding綁定是經(jīng)過設(shè)置兩個(gè)HTTP信道來支持雙向通訊。 【3.2】實(shí)現(xiàn)代碼: 一個(gè)效力契約只能包含一個(gè)回調(diào)契約。經(jīng)過ServiceContract特性,可以指定回調(diào)契約:/0.回調(diào)效力契約,由于回調(diào)方法在客戶端執(zhí)行,因此無須添加ServiceContractAttribute。對(duì)于回調(diào)操作,效力器無須獲取其前往信息,因此添加IsOneWay=true特性參數(shù)。publicinterfaceIWCFServiceCallBack/操作契約OperationContract(IsOneWay=true)/voidSayHelloCalllBack();/1.效力契約,指

14、定SessionMode和回調(diào)類型。ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IWCFServiceCallBack)publicinterfaceIWCFService/操作契約,OperationContractstringSayHelloToUser(stringname); 回調(diào)契約無須標(biāo)志ServiceContract特性,但是在回調(diào)契約中必需為效力的操作標(biāo)志OperationContract特性。 在導(dǎo)入回調(diào)契約的元數(shù)據(jù)中,回調(diào)契約以Callback結(jié)尾。效力端反序列化本地代碼的

15、時(shí)候會(huì)生成客戶端回調(diào)操作契約Callback后綴?!?.3】回調(diào)小節(jié):1假設(shè)運(yùn)用了回調(diào)契約,回調(diào)契約不需求ServiceContract特性,設(shè)置為回調(diào)契約就默許了效力契約的特性。2客戶端經(jīng)過回調(diào)傳送給效力端的音訊包含了回調(diào)契約終結(jié)點(diǎn)的援用。在效力端,可以經(jīng)過OperationContext類的泛型方法GetCallbackChannel()獲得。代碼如下:/獲取客戶端通道實(shí)例IWCFServiceCallBackcallback=OperationContext.Current.GetCallbackChannel();【4】例如代碼分析: 直接看概念還不能很好的了解回調(diào)的機(jī)制,下面我們來詳

16、細(xì)看看WCF里如何實(shí)現(xiàn)回調(diào)。客戶端調(diào)用效力操作,效力操作經(jīng)過客戶端上下文實(shí)例調(diào)用客戶端操作,這是回調(diào)操作的根本過程。一下是詳細(xì)的代碼實(shí)現(xiàn)講解過程。這里只引見回調(diào)操作的詳細(xì)實(shí)現(xiàn)代碼。單向操作過于簡(jiǎn)單,注釋也比較詳細(xì),大家可以參考上傳的代碼。【4.1】效力端: 定義一個(gè)回調(diào)契約IWCFServiceCallBack,效力契約IWCFService、效力類WCFService : IWCFService承繼效力契約。代碼如下:/1.回調(diào)效力契約,由于回調(diào)方法在客戶端執(zhí)行,因此無須添加ServiceContractAttribute。對(duì)于回調(diào)操作,效力器無須獲取其前往信息,因此添加IsOneWay=t

17、rue特性參數(shù)。publicinterfaceIWCFServiceCallBack/操作契約OperationContract()/voidSayHelloCalllBack();/2.效力契約,指定CallbackContract回調(diào)契約。ServiceContract(CallbackContract=typeof(IWCFServiceCallBack)publicinterfaceIWCFService/操作契約,OperationContractstringSayHelloToUser(stringname);/3.效力類,承繼接口。實(shí)現(xiàn)效力契商定義的操作publicclassWC

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

19、elloCalllBack();returnHello!+name; 效力端獲取當(dāng)前操作客戶端對(duì)象實(shí)例 IWCFServiceCallBack callback = OperationContext.Current.GetCallbackChannel();callback.SayHelloCalllBack();執(zhí)行回調(diào)客戶端當(dāng)前實(shí)例方法?!?.2】宿主: 宿主啟動(dòng)和綁定節(jié)點(diǎn)配置和前面幾節(jié)講解的配置過程類似。這里配置的協(xié)議是TCP。配置文件代碼如下:【4.3】客戶端: 運(yùn)轉(zhuǎn)效力托管宿主,客戶端添加效力援用,反序列化效力元數(shù)據(jù),如圖: 修正客戶端代碼,重新實(shí)現(xiàn)回調(diào)契約的操作方法,如下:Syst

20、em.CodeDompiler.GeneratedCodeAttribute(System.ServiceModel,)publicclassWCFServiceCallback:IWCFServiceCallbackpublicvoidSayHelloCalllBack()Console.WriteLine(ClientmethodisCallBacking); 測(cè)試回調(diào)代碼,我們實(shí)例化一個(gè)回調(diào)類的實(shí)例,然后作為上下文實(shí)例的參數(shù)。最后把上下文作為參數(shù)實(shí)例化一個(gè)客戶端代理。詳細(xì)代碼如下:/CallBack回調(diào)效力Console.WriteLine(CallBackOperationTest);

21、WCFClientCallBack.IWCFServiceCallbackcallBack=newWCFClientCallBack.WCFServiceCallback();InstanceContextcontext=newInstanceContext(callBack);WCFClientCallBack.WCFServiceClientWCFServiceCallBackClientProxy=newWCFClientCallBack.WCFServiceClient(context,NetTcpBinding_IWCFService);/經(jīng)過代理調(diào)用調(diào)用SayHelloToUser

22、,傳送對(duì)象Console.WriteLine(WCFServiceCallBackClientProxy.SayHelloToUser(FrankXuLeiCallBack);【4.4】運(yùn)轉(zhuǎn)結(jié)果: 這里的運(yùn)轉(zhuǎn)結(jié)果包括單向操作和回調(diào)操作結(jié)果,客戶端調(diào)用一個(gè)效力操作,效力操作再經(jīng)過客戶端上下文實(shí)例援用調(diào)用客戶端操作。勝利執(zhí)行回調(diào)操作。結(jié)果如圖:【5】總結(jié):1效力對(duì)回調(diào)的調(diào)用能夠會(huì)產(chǎn)生死鎖。就是指當(dāng)回調(diào)的應(yīng)對(duì)音訊也需求獲得與效力實(shí)例關(guān)聯(lián)的一樣的鎖時(shí),會(huì)導(dǎo)致死鎖。此時(shí)效力線程曾經(jīng)被阻塞,效力操作正在等待回調(diào)操作執(zhí)行終了,而回調(diào)操作卻又在等待效力釋放鎖。 處理死鎖的方法:將效力配置為允許多線程訪問,會(huì)添

23、加效力開發(fā)者負(fù)擔(dān)。將回調(diào)設(shè)置為重入Reentrancy /3.效力類,承繼接口。實(shí)現(xiàn)效力契商定義的操作 ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant) public class WCFService : IWCFService . 。所謂“重入,是指對(duì)同步域擁有獨(dú)占訪問權(quán)的線程A調(diào)用了同步域之外對(duì)象的方法,此時(shí),另外的線程B假設(shè)要訪問該同步域,那么線程A將釋放對(duì)同步域的鎖,允許線程B進(jìn)入。直到線程B執(zhí)行終了并釋放對(duì)同步域的鎖后,線程A將重新進(jìn)入該同步域。由于效力被配置為重入,那么效力調(diào)用回調(diào)援用時(shí)會(huì)釋放鎖。然后將回調(diào)前往給客戶端,控制權(quán)那么前往給效力,效力會(huì)重入并重新獲取鎖。將回調(diào)操作設(shè)置為單向操作 OperationContract(IsOneWay=true)/void SayHelloCalllBack();。此時(shí),回調(diào)調(diào)用不會(huì)產(chǎn)生應(yīng)對(duì)音訊,效力操作一旦執(zhí)行了回調(diào)操作,就會(huì)繼續(xù)執(zhí)行,回調(diào)對(duì)象不會(huì)爭(zhēng)用與效力實(shí)例關(guān)聯(lián)的鎖,從而處理了死鎖問題。2單調(diào)效力的回調(diào)問題需求思索回調(diào)對(duì)象的援用存儲(chǔ)問題,由于

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論