做了一下动态生成内容的客户端缓存测试,记录一下用到的代码。
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信息。
$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);
?>