public class HomeController Controller {public ActionResult Index(){ return View();}public string GetCurrentTime(){ return DateTime.Now.ToLongTimeString();} }默认Action方法Index对应的View定义如下。我们每隔5秒钟利用JQuery的方法以Ajax的方式调用GetCurrentTime操作,并将返回的结果显示出来。
<!DOCTYPE html> <html><head> <title>@ViewBag.Title</title><script type="text/javascript" src="@Url.Coutent(“~/Scripts/jquery-...min.js”)"></script> <script type="text/javascript">$(function () { window.setInterval(function () {$.ajax({ url"@Url.Action("GetCurrentTime")", success function (result) {$("ul").append("<li>" + result + "</li>"); }}); }, );}); </script></head><body><ul></ul></body> </html>采用不同的浏览器运行该程序会得到不同的输出结果,如下图所示,Chrome浏览器中能够显示出实时时间,但是在IE中显示的时间都是相同的。
二、通过为URL地址添加后缀的方式解决问题
由于IE针对Ajax请求的返回的结果是根据请求地址进行缓存的,所以如果不希望这个缓存机制生效,我们可以在每次请求时为请求地址添加不同的后缀来解决这个问题。针对这个例子,我们通过如下的代码为请求地址添加一个基于当前时间的查询字符串,再次运行程序后IE中将会显示实时的时间。
<!DOCTYPE html> <html><head> <script type="text/javascript">$(function () { window.setInterval(function () {$.ajax({ url"@Url.Action("GetCurrentTime")?"+ new Date().toTimeString() , success function (result) {$("ul").append("<li>" + result + "</li>"); }}); }, );}); </script></head> </html>三、通过jQuery的Ajax设置解决问题
<!DOCTYPE html> <html><head> <script type="text/javascript">$(function () { $.ajaxSetup({ cache false });window.setInterval(function () {$.ajax({ url"@Url.Action("GetCurrentTime")", success function (result) {$("ul").append("<li>" + result + "</li>"); }}); }, );}); </script></head> </html>实际上jQuery的这个机制也是通过为请求地址添加不同的查询字符串后缀来实现的,这可以通过Fiddler拦截的请求来证实。
四、通过定制响应解决问题
我们可以通过请求的响应来控制浏览器针对结果的缓存,为此我们定义了如下一个名为NoCacheAttribute的ActionFilter。在实现的OnActionExecuted方法中,我们调用当前HttpResponse的SetCacheability方法将缓存选项设置为NoCache。该NoCacheAttribute特性被应用到GetCurrentTime方法后,运行我们的程序在IE中依然可以得到实时的时间。
public class HomeController Controller {public ActionResult Index(){ return View();}[NoCache] public string GetCurrentTime(){ return DateTime.Now.ToLongTimeString();} } public class NoCacheAttribute FilterAttribute, IActionFilter {public void OnActionExecuted(ActionExecutedContext filterContext){ filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);} public void OnActionExecuting(ActionExecutingContext filterContext){} }实际NoCacheAttribute特性最终控制消息消息的Cache-Control报头,并将其设置为“no-cache”,指示浏览器不要对结果进行缓存。如下所示的是针对GetCurrentTime请求的响应消息:
HTTP/. OK Server ASP.NET Development Server/... Date Thu, Jan GMT X-AspNet-Version .. X-AspNetMvc-Version . Cache-Control no-cachePragma no-cache Expires - Content-Type text/html; charset=utf- Content-LengthConnection Close PM