缓存的一点测试

做了一下动态生成内容的客户端缓存测试,记录一下用到的代码。

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);
?>

发表评论