基于Http的雙向通訊V.S.基于TCP的雙向通訊
由于Http和TCP在各自協(xié)議上的差異,他們實(shí)現雙向通信的發(fā)式是不同的。
Http是一個(gè)應用層的協(xié)議,它的主要特征就是無(wú)連接和無(wú)狀態(tài)(connectless & stateless)。它采用傳統的Request/Reply的方式進(jìn)行通信,Client發(fā)送HttpRequest請求Server的某個(gè)資源,Server端接收到該Http Request, 回發(fā)對應的HttpResponse。當Client端接收到對應的Response,該Connection會(huì )關(guān)閉。也就是說(shuō)Client和Server的Connection僅僅維持在發(fā)送Request到接收到Response這一段時(shí)間內。同時(shí),每次基于Http的connection是相互獨立,互不相干的,當前connection無(wú)法獲得上一次connection的狀態(tài)。為了保存調用的的狀態(tài)信息,ASP.NET通過(guò)把狀態(tài)信息保存在Server端的方式實(shí)現了對Session的支持,具體的做法是:ASP.NET為每個(gè)Session創(chuàng )建一個(gè)Unique ID,與之關(guān)聯(lián)一個(gè)HttpSessionState對象,并把狀態(tài)信息保存在內存中或者持久的存儲介質(zhì)(比如SQLServer)中。而WCF則采用另外的方式實(shí)現對Session的支持:每個(gè)Session關(guān)聯(lián)到某個(gè)Service Instance上。
回到我們WCF雙向通信的問(wèn)題上,當Client調用Service之前,會(huì )有一個(gè)Endpoint在Client端被創(chuàng )建,用于監聽(tīng)Service端對它的Request。Client對Service的調用會(huì )建立一個(gè)Client到Server的Connection,當Service在執行操作過(guò)程中需要Callback對應的Client,實(shí)際上會(huì )建立另一個(gè)Service到Client的Httpconnection。雖然我們時(shí)候說(shuō)WCF為支持雙向通信提供Duplex Channel,實(shí)際上這個(gè)Duplexchannel是由兩個(gè)Request/Reply Channel組成的。
而對于TCP/IP簇中的傳輸層協(xié)議TCP,它則是一個(gè)基于Connection的協(xié)議,在正式進(jìn)行數據傳輸的之前,必須要在Client和Server之后建立一個(gè)Connection,Connection的建立通過(guò)經(jīng)典的“3次握手”來(lái)實(shí)現。TCP天生就具有Duplex的特性,也就是說(shuō)當Connection被創(chuàng )建之后,從Client到Sever,和從Server到Client的數據傳遞都可以利用同一個(gè)Connection來(lái)實(shí)現。對于WCF中的雙向通信,Client調用Service,Service CallbackClient使用的都是同一個(gè)Connection、同一個(gè)Channel。所以基于TCP的DuplexChannel才是真正意義上的Duplex Channel。
聯(lián)系客服