http是无状态协议,整个过程仅仅是:请求-响应。是不能推送的,只能客户端不断请求。你Ajax请求做个判断如果没有数据更新,则不更新显示到页面上。
最近刚好在写jQuery.ajax()的博文,这个函数能满足你的要求,即服务器数据变更时才进行回发数据并作更新,当然前提是客户端要发出请求,倘若你的请求是自动的那么可以使用javascript中的setInternal设置定时请求函数。对于ajax中你需要使用cache和ifModified函数,当然你不使用jQuery可以自己做封装。。。
另外Jquery.ajax()博文还在整理中,我将相关部分先给你看看 (你还可以baidu关键字Last-Modified / If-Modified-Since获取其他信息)
2) ifModified参数:通过ifModified参数提高请求性能(即:“条件GET”:Last-Modified / If-Modified-Since和ETag / If-None-Match)
当你请求的资源并不是一层不变的时候,即不能简单的一直使用客户端缓存时,你可能通过将cache设置为false来发送请求,这实际上是在url加上时间戳组合成新的url去请求资源,这明显加大了服务器的压力。
对于这种情况,我们可以通过ifModified参数改进缓存方式,即仅在请求的数据改变时重新获取,这种改进方式请求的url不会改变,并且每次都会发送到服务器,只是会有检验方法验证是否需要重新获取数据从而节省带宽和开销。
更多ETag描述(优点,解决了Last-Modified无法解决的一些问题,什么场合不应该被使用)
过程如下:
a) 将$.ajax()函数的cache和ifModified参数同时设置为true。
b) 客户端请求服务端A,在服务端加上Last-Modified/ETag响应体一起返回。
c) 客户端缓存接收到的Last-Modified/ETag响应体,并在下一次发生请求A时将缓存的Last-Modified/ETag做为If-Modified-Since/IF-None-Match请求头一起发给服务器。
d) 服务器接收If-Modified-Since/IF-None-Match后,就检验自上次客服端请求之后资源是否有改动
i. 若还未改动则直接返回响应304和一个空的响应体。
ii. 若已改动则重新处理数据,返回最新的请求数据。
e) 保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
这一过程中,我们只需要做:服务器返回Last-Modified/ETag响应头和检验数据是否失效并采取对应处理方式。其余步骤由jQuery框架的ajax()函数完成。
服务端关键代码:
if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])
|| !String.IsNullOrEmpty(context.Request.Headers["Etag"]))
{
if (CheckResourceValidate()) // 检查资源有效性
{
// 如果资源有效,则直接返回304状态码,客户端回去到此状态码后会从缓存中取值。
context.Response.StatusCode = 304;
return;
}
}
// 请求数据
GetServerTimeAfter2Second();
context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(5));
context.Response.Cache.SetLastModified(DateTime.Now);
http://my.oschina.net/u/2544092/blog/540663
我发现最近大家都在说Goeasy不错,专业做web消息实时推送的,我试了一下,发现还真的不错,中英文齐全,服务器稳定,体积小,SDK居然只有11kb,如果你们想试试的话,可以登录https://goeasy.io/去看一下;
goeasy的免费时间只有一年