ASP.NETにおけるServer Pushの使用例の分析

5920 ワード

この例ではASPについて述べる.NETでのServer Pushの使い方.皆さんの参考にしてください.具体的な分析は以下の通りである.
サーバPushとは、サーバがクライアントに「プッシュ」することであり、実は「長接続」である.
ブラウザがサーバ側を要求してこそ、サーバ側はブラウザにデータを応答し、ブラウザにデータを積極的にプッシュすることはできない.これは安全上の考慮であり、サーバの性能向上の考慮でもある.サーバがブラウザにデータを積極的にプッシュする場合、サーバPushなどの技術シミュレーションを用いて実現しなければならない.
例を挙げます.
2つのページが互いにメッセージを送信することによって実現され、メッセージはデータベースに置かれる.

/// 
/// ServerPush1      
/// 
public class ServerPush1 : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
   context.Response.ContentType = "application/json";
   string action = context.Request["action"];
   if (action == "send")//  
   {
    string me = context.Request["me"];
    string toUserName = context.Request["toUserName"];
    string msg = context.Request["msg"];
    SQLHpler.ExecuteNonQuery("INSERT INTO T_Msgs(FromUserName,ToUserName,Msg) VALUES(@FromUserName,@ToUserName,@Msg)", new SqlParameter("@FromUserName", me),
     new SqlParameter("@ToUserName", toUserName),
     new SqlParameter("@Msg", msg));
    context.Response.Write(new JavaScriptSerializer().Serialize(new { Status = "ok" }));
   }
   else if (action == "receive")
   //  ,     、          
   {
    //        , ServerPush1.ashx?me=sean
    //    sean        
    string me = context.Request["me"];
    while (true)
    {
     DataTable dt = SQLHpler.ExecuteQuery("SELECT TOP 1 * FROM T_Msgs WHERE ToUserName=@ToUserName",new SqlParameter("@ToUserName", me));
     if (dt.Rows.Count <= 0)
     {
      Thread.Sleep(500);//   ,  500ms   ,             ,   WEB   CPU  
      continue;//   while
     }
     else
     {
      DataRow row = dt.Rows[0];
      long id = (long)row["Id"];
      string fromUserName = (string)row["FromUserName"];
      string msg = (string)row["Msg"];
      //          ,        ,             
      SQLHpler.ExecuteNonQuery("DELETE FROM T_Msgs WHERE Id=@Id",new SqlParameter("@Id",id));
      //        ,           
      var data = new { FromUserName = fromUserName, Msg = msg, Id = id };
      string json = new JavaScriptSerializer().Serialize(data);//        json
      context.Response.Write(json);//      json    
      break;
     }
    }
   }
   else
   {
    throw new Exception("action  ");
   }
}







<script type="text/javascript" src="jquery-1.8.3.min.js"/>
<script type="text/javascript">
var rev = function () {
 var mine = $('#me').val();
 $.ajax({
  type: 'post', url: 'serverPush1.ashx',
  data: { action: 'receive', me: mine },//  serverPush.ashx  me    me   
  success: function (data) {
   $('#ulMsg').append($('<li>' + data.FromUserName + '   :' + data.Msg + '</li>'));
   rev();//              ,       
  },
  error: function () {
   rev();
   //        (        ),       
  }
 });
};
$(function () {
 //  
 $('#btnSend').click(function () {
  var myName = $('#me').val();
  var toUserName = $('#toUserName').val();
  var msg = $('#msgContext').val();
  $.ajax({
   type: 'post', url: 'serverPush1.ashx',
   data: { action: 'send', me: myName, toUserName: toUserName, msg: msg },//         ,     ServerPush.ashx      
   success: function (data) {
    if (data.Status == 'ok') {//      ,
     $('#ulMsg').append($('<li>  ' + toUserName + ' :' + msg + '</li>'));
     $('#msgContext').val('');
    }
    else {
     alert('    ,        ');
    }
   },
   error: function () {
    alert('    ');
   }
  });
 });
 //  ,    
 $('#btnLogin').click(function () {
  rev();
  $(this).attr("disabled", "disabled");
 });
 /*
 $('#btnLogin').click(function () {//  
  var mine = $('#me').val();
  $.ajax({
   type: 'post', url: 'serverPush1.ashx',
   data: { action: 'receive', me: mine },
   //  serverPush.ashx  me    me   
   success: function (data) {
    $('#ulMsg').append($('<li>' + data.toUserName + '   :' + data.msg + '</li>'));
   },
   error: function () {
    alert('    ');
   }
  });
 });*/
});
</script>


    :<input type="text" id="me"/><input type="button" id="btnLogin" value="  " style=""/><br/>
    :<input type="text" id="toUserName"/><br/>
     :<input type="text" id="msgContext"/><input type="button" id="btnSend" value="  "/><br/>
     :<br/>
 </code></pre><ul id="ulMsg">
 </ul>

 
 </div> 
 <p>          asp.net        。</p> 
 <div class="clearfix"> 
  <span id="art_bot" class="jbTestPos"/> 
 </div> 
</div>
                            </div>
                        </div>