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