做了一下动态生成内容的客户端缓存测试,记录一下用到的代码。
C#的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Globalization; namespace WebApplication { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class demo : IHttpHandler { public void ProcessRequest(HttpContext context) { // 设置缓存的秒数。 TimeSpan timeout_duration = TimeSpan.FromSeconds(10); context.Response.ContentType = "application/javascript"; context.Response.Cache.SetCacheability(HttpCacheability.Public); DateTime modifiedSince; // 解析请求的头的If-Modified-Since信息。 DateTime.TryParse(context.Request.Headers["If-Modified-Since"], DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.AdjustToUniversal, out modifiedSince); DateTime utcNow = DateTime.UtcNow; if (modifiedSince.AddTicks(timeout_duration.Ticks) < utcNow) { // 内容已过期,重新生成信息,响应200。 context.Response.Cache.SetMaxAge(timeout_duration); context.Application["counter"] = int.Parse(context.Application["counter"].ToString()) + 1; context.Response.Cache.SetLastModified(utcNow); context.Response.StatusCode = 200; context.Response.Write(string.Format("document.write({0})", context.Application["counter"])); } else { // 内容未更改,响应304。 context.Response.Cache.SetMaxAge(modifiedSince + timeout_duration - utcNow); context.Response.Cache.SetLastModified(modifiedSince); context.Response.StatusCode = 304; } } public bool IsReusable { get { return false; } } } }
php的代码:
<?php // 设置缓存的秒数。 $timeout_duration = 10; // 解析请求的头的If-Modified-Since信息。 // 按CTRL+F5强制刷新的时候,这里将被设置为NULL。 $client_time_stamp = $_SERVER['HTTP_IF_MODIFIED_SINCE']; $client_time_stamp = (isset($client_time_stamp)? strtotime($client_time_stamp): 0); $now = time(); $server_now_time_str = gmdate('D, d M Y H:i:s'). ' GMT'; header('Content-Type: application/javascript'); if(($client_time_stamp + $timeout_duration) < $now) { // 内容已过期,重新生成信息,响应200。 header("Last-Modified: $server_now_time_str", true, 200); header("Cache-Control: max-age={$timeout_duration}"); $micro = microtime(); $script = <<<SCRIPT document.write('{$micro} <br />'); SCRIPT; echo $script; } else { // 内容未更改,响应304。 header("Last-Modified: {$_SERVER['HTTP_IF_MODIFIED_SINCE']}", true, 304); $max_age = $client_time_stamp + $timeout_duration - $now; header("Cache-Control: max-age={$max_age}"); } exit(0); ?>