本文实例讲述了ASP.NET中ServerPush用法。分享给大家供大家参考。具体分析如下:
什么是ServerPush,服务器向客户端“推送“,其实就是”长连接“
只有浏览器请求服务器端,服务器端才给浏览器响应数据,不会主动向浏览器推送数据,这是一种安全考虑,也是提高服务器的性能考虑,如果服务器向浏览器主动推送数据,就要用到ServerPush等技术模拟实现。
举个例子:
通过两个页面互相发送消息实现,消息放到数据库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/// <summary>
/// ServerPush1 的摘要说明
/// </summary>
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错误" );
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
<!DOCTYPE html>
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" />
<title></title>
<script type= "text/javascript" src= "jquery-1.8.3.min.js" ></script>
<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>
</head>
<body>
发送人:<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 />
<ul id= "ulMsg" >
</ul>
</body>
</html>
|
希望本文所述对大家的asp.net程序设计有所帮助。