最近刚好在写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不会改变,并且每次都会发送到服务器,只是会有检验方法验证是否需要重新获取数据从而节省带宽和开销。
过程如下:
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);