5

最近几天,我在考虑 asp.net 中的输出缓存。在我的任务中,我需要为非常大的项目实现输出缓存。经过数小时的搜索,我没有找到任何示例。

最流行的使用输出缓存的方法是声明式的,在这种情况下,您需要在要缓存的页面上编写类似这样的内容。

但是,如果您需要缓存整个站点,则必须将其写入项目的所有页面或母版页上。这是疯狂。在这种情况下,您不能将所有配置存储在一个地方。所有页面都有他自己的配置..

Global.asax 可以帮助我,但我的网站包含大约 20 个网络项目和约 20 个 global.asax 文件。而且我不想将相同的代码复制到每个项目。

由于这些原因,我决定创建 HTTPModule。在 Init 方法中,我订阅了两个事件:

public void Init(HttpApplication app)
{
  app.PreRequestHandlerExecute += new EventHandler(OnApplicationPreRequestHandlerExecute);
  app.PostRequestHandlerExecute += new EventHandler(OnPostRequestHandlerExecute);
}

在方法“OnPostRequestHandlerExecute”中,我为每个新请求设置了输出缓存参数:

public void OnPostRequestHandlerExecute(object sender, EventArgs e)
{
  HttpApplication app = (HttpApplication)sender; 
  HttpCachePolicy policy = app.Response.Cache;
  policy.SetCacheability(HttpCacheability.Server);
  policy.SetExpires(app.Context.Timestamp.AddSeconds((double)600));
  policy.SetMaxAge(new TimeSpan(0, 0, 600));
  policy.SetValidUntilExpires(true);
  policy.SetLastModified(app.Context.Timestamp);
  policy.VaryByParams.IgnoreParams = true; 
}

在“OnApplicationPreRequestHandlerExecute”方法中,我将回调方法设置为缓存验证:

public void OnApplicationPreRequestHandlerExecute(object sender, EventArgs e)
{
  HttpApplication app = (HttpApplication)sender;
  app.Context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), app);
}

最后一部分 - 回调验证方法:

public void Validate(HttpContext context, Object data, ref HttpValidationStatus status)
{
  if (context.Request.QueryString["id"] == "5")
  {
      status = HttpValidationStatus.IgnoreThisRequest;
      context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), "somecustomdata");
  }
  else
  {
      status = HttpValidationStatus.Valid;
  }
}

要附加我的 HttpModule,我以编程方式使用附加方法:

[assembly: PreApplicationStartMethod(typeof(OutputCacheModule), "RegisterModule")]

这种方法效果很好,但我想知道还有其他方法可以做到这一点。谢谢。

4

1 回答 1

0

尝试查看 IIS 缓存是否满足您的需求。

http://www.iis.net/configreference/system.webserver/caching

于 2012-09-18T17:31:36.140 回答