如何用ASP.NET實現bosh模擬http雙向長連接請求


  在做研究之前先簡單說一下之前公司的通訊模塊。最早的時候公司開發的web管理系統是需要配合c++桌面客戶端進行一些系統底層操作,並非普通的b/s架構,或者c/s架構,因為需求是可以通過web管理系統向客戶端發送一些簡單的指令和策略,客戶端根據不同只指令或策略進行系統底層的一些操作,並可以向服務器提交日志及狀態信息.

  依此我們設計了如下架構:

  

  其中web服務器是用c#寫的,通訊服務器是用c++寫的,客戶端使用c++寫的,管理員通過web登錄到web服務器管理界面,將相關策略發送到通訊服務器,再由通訊服務器通知到c++客戶端,為了保證能夠即時得到通知,使用通訊服務器與客戶端之間建立tcp連接是必須的。但是由此導致了一個問題,就是通訊服務器中可能包含了和web服務器相同的業務代碼,導致維護比較麻煩,並且在c++通訊服務器中修改業務代碼,沒有web服務器中的asp.net那么方便.

  后來我們修改了這種設計方式,通訊服務器只是用來做和客戶端之間的長連接維持,只接收轉發web管理服務器下發的指令,當c++客戶端需要獲取數據,或者提交業務數據的時候,直接連接到web服務器post相關請求獲取或者提交數據.這樣客戶端的連接通道分成了指令通道(TCP)和數據通道(HTTP).這樣的好處是通訊服務器不用再處理業務了,所有的業務處理都通過數據通道交由web管理服務器處理.通訊服務器不需要再發生改變.

  再就是后來我們想到是不是通訊服務器也可以去掉,這樣可以節省掉c++模塊的維護,只使用web服務器進行通訊,並且也方便以后的調試.但是使用http協議進行通訊有個最大的缺陷就是只能客戶端通過web服務器去拉取數據,而web服務器無法向客戶端主動下發數據.為了克服這個缺點,研究了使用http協議輪詢數據,或者建立http長連接,但在時效性,性能,兼容性各方面考慮最后還是沒有使用.后來研究xmpp的時候,發現webIM的很多實現用了一種叫Bidirectional-streams Over Synchronous HTTP (BOSH)的技術,可以模擬雙向通訊.於是下面我就是實驗了一下.

  根據bosh的說法就是客戶端向服務器發起請求之后,服務器如果當前沒有數據的話,就hold住這個請求,不立即返回,當有數據的時候,再返回此次請求.怎樣hold住就是問題的關鍵了,由於之前沒用過asp.net但可以預見到,直接把請求的當前線程掛起是不行的,如果1000個請求就掛住一千個線程,服務器是受不了的,猜測asp.net應該有一種異步處理機制的,網上搜了一下,果然米有問題,添加"一般處理程序"修改為繼承異步接口就可以了,如下代碼.

    public class _long : IHttpAsyncHandler
    {
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
        public System.IAsyncResult BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData)
        {
            LongAsyncResult result = new LongAsyncResult(cb, context);
            try
            {
        //do something
            }
            catch (System.Exception ex)
            {
                result.SetSyncComplete();
            }
            return result;
        }
        public void EndProcessRequest(System.IAsyncResult result)
        {
        //do something
        }
        public void ProcessRequest(System.Web.HttpContext context)
        {
            //throw new Exception("The method or operation is not implemented.");
        }
    }

  后來我們公司根據實際情況還是用http建立了兩個通道,一般業務請求處理,使用普通的http短連接請求,而服務器的數據下發則使用的bosh建立的雙向通道.經過測試修改iis部分配置之后,連接數是沒有限制的,關鍵就是看業務執行的效率了.如果對性能沒有什么特殊的要求的話,這種實現方式的開發效率還是很高的.

總結一下使用這種方式的好處:

  可以利用IIS穩定高效的底層通訊框架。
  可以使用.NET框架迅速開發出穩定程序,並可以方便對業務的快速修改。
  可以跨平台部署通訊服務器。
  可以利用IIS或者Apache現成的負載均衡解決方案。
  在外網部署,http協議防火牆穿透性比較強。
  可以利用一些現成的http代理服務器進行通訊跳轉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM