缓存的一点测试

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

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

关于 小寒

这人很懒。
此条目发表在 ASP.NET, 个人日记 分类目录,贴了 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>