.Net MVCロングポーリングを実現

5442 ワード

長いポーリングとは?
ロングポーリングは、クライアントが頻繁にリクエストをリフレッシュしたり送信したりすることなく、サービス側で発生した変化をリアルタイムでクライアントに転送する「サーバプッシュ」テクノロジーの実装方法の1つです.
ロングポーリングの原理?
クライアントはサーバにAjax要求を送信し、サーバは要求を受信した後、接続を維持してメッセージを返さず、関連処理が完了するまで応答情報を返して接続を閉じ、クライアントは応答情報を受信した後、関連処理を行い、処理が完了した後、サーバに新しい要求を送信したい.
長いポーリングの適用シーン?
長いポーリングは、Webのタイムリーな通信、監視、インスタントオファーシステムなど、サービス側の変化をクライアントにリアルタイムで送信する必要があるシーンによく使用されます.
長いポーリングの長所と短所?
利点:メッセージがない場合、サーバにリクエストを頻繁に送信しません.
欠点:サーバが接続を維持するのに比較的リソースがかかる
実装:
フロントコード:
コールバックでは、関数を再度呼び出し、リクエストが閉じるたびに次のリクエストを開始します.
<div id="container"></div>
<script type="text/javascript">
    $(function () {
        function longPolling() {
            $.getJSON("/DateTime/GetTime", function (json) {
                $("#container").append(json.date + "<br/>");
                longPolling();
            });
        };
        longPolling();
    });
</script>

バックグラウンドコード:
バックグラウンドのControllerは非同期を使用してAsyncControllerベースクラスを継承します
public class DateTimeController : AsyncController
    {
        public void GetTimeAsync()
        {
            //   ,5      Elapsed          
            System.Timers.Timer timer = new System.Timers.Timer(5000);
            //  .NET                   
            AsyncManager.OutstandingOperations.Increment();
            //      Elapsed      
            timer.Elapsed += (sender, e) =>
            {  //       GetTimeCompleted                   
                AsyncManager.Parameters["nowdate"] = e.SignalTime;
                //  ASP.NET       ,  GetTimeCompleted                    
                AsyncManager.OutstandingOperations.Decrement();
            };
            //            
            timer.Start();
        }
        public ActionResult GetTimeCompleted(DateTime nowdate)
        {
            return Json(new { date = nowdate.ToString("HH:mm:ss") + "  Welecom " }, JsonRequestBehavior.AllowGet);
        }
    }