WCF简单教程(6) 单向与双向通讯
第六篇:單向與雙向通訊
項(xiàng)目開(kāi)發(fā)中我們時(shí)常會(huì)遇到需要異步調(diào)用的問(wèn)題,有時(shí)忽略服務(wù)端的返回值,有時(shí)希望服務(wù)端在需要的時(shí)候回調(diào),今天就來(lái)看看在WCF中如何實(shí)現(xiàn)。
先看不需要服務(wù)端返回值的單向調(diào)用,老規(guī)矩,直接上代碼,再解釋。
1、服務(wù)端
契約接口中增加一個(gè)Sleep方法:
對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)中,我們來(lái)實(shí)現(xiàn)這個(gè)方法:
App.config就不再列出來(lái)了,里面用的是一個(gè)netTcpBinding的endpoint。
2、客戶(hù)端
首先別忘了客戶(hù)端的契約要與服務(wù)端保持一致,App.config也不列出來(lái)了,里面有對(duì)應(yīng)的endpoint。主要是調(diào)用的代碼:
按我們的設(shè)想,兩次SayHello調(diào)用之間應(yīng)該沒(méi)有延遲,因?yàn)镾leep是異步的嘛,編譯運(yùn)行一下,結(jié)果…… ?中間卡住了5秒,這是為什么呢?
這其中涉及到一個(gè)并發(fā)模型的問(wèn)題,默認(rèn)情況下,WCF以單線程模型對(duì)外提供服務(wù),也就是說(shuō),只能一個(gè)一個(gè)處理請(qǐng)求,即使是一個(gè)OneWay的單向調(diào)用,也只能等它處理完后才會(huì)接著處理后面的SayHello請(qǐng)求,所以會(huì)卡5秒。
并發(fā)模式有以下三種,MSDN上的介紹有點(diǎn)復(fù)雜,我給簡(jiǎn)化一下:
| Single:單線程調(diào)用,請(qǐng)求只能一個(gè)一個(gè)處理; Reentrant:可重入的單線程調(diào)用,本質(zhì)仍是單線程,處理回調(diào)時(shí),回調(diào)請(qǐng)求會(huì)進(jìn)入隊(duì)列尾部排隊(duì); Multiple:多線程調(diào)用,請(qǐng)求是并發(fā)的響應(yīng)的; |
調(diào)置服務(wù)并發(fā)模型是在契約的實(shí)現(xiàn)類(lèi)上,我們?yōu)镈ataService類(lèi)加一個(gè)Attribute:
這回再編譯運(yùn)行一下,連續(xù)打出了2行 Hello WCF,中間不再阻塞了。
?
現(xiàn)在我們?cè)賮?lái)看看雙向通訊的問(wèn)題。雙向通訊可以基于HTTP、TCP、Named Pipe、MSMQ,但要注意,basicHttpBinding和wsHttpBinding不行,要換用wsDualHttpBinding,它會(huì)創(chuàng)建兩個(gè)連接來(lái)進(jìn)行雙向通訊。至于TCP,它天然就是雙向通訊的。
1、服務(wù)端
服務(wù)契約要進(jìn)行修改,增加關(guān)于回調(diào)的契約:
對(duì)應(yīng)的契約實(shí)現(xiàn)類(lèi)要修改一下:
2、客戶(hù)端
仍然提醒一下別忘了把新的服務(wù)契約更新到客戶(hù)端。客戶(hù)端的調(diào)用要調(diào)整一下:
編譯運(yùn)行,屏幕先顯示一行“Hello WCF.”,過(guò)5秒后顯示“收到回調(diào)了:睡醒了”。
?
轉(zhuǎn)載于:https://blog.51cto.com/boytnt/803655
總結(jié)
以上是生活随笔為你收集整理的WCF简单教程(6) 单向与双向通讯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 庆祝51CTO六周年:资源牛人有奖比拼,
- 下一篇: 误删表数据,如何恢复过来