最近我在思考如何在asp.net中使用输出缓存。在我的任务中,我需要为一个非常大的项目实现输出缓存。经过几个小时的搜索,我没有找到任何例子。
最流行的使用输出缓存的方法是声明式的,在这种情况下,您需要在要缓存的页面上编写类似于以下内容的代码:
但如果您需要缓存整个站点,您必须在项目的所有页面或主页面上编写此代码。这是一种疯狂的做法。在这种情况下,您不能将所有配置存储在一个地方。每个页面都有自己的配置...
Global.asax可以帮助我,但我的网站包含约20个Web项目和大约20个Global.asax文件。我不想将相同的代码复制到每个项目中。
出于这些原因,我决定创建HTTPModule。在Init方法中,我订阅了两个事件:
在方法"OnPostRequestHandlerExecute"中,我为每个新请求设置了输出缓存参数:
在"OnApplicationPreRequestHandlerExecute"方法中,我将回调方法设置为缓存验证:
为了附加我的 HttpModule,我使用编程方式附加方法:
这种方法很完美,但我想知道是否有其他方法可以实现这个目的。谢谢。
最流行的使用输出缓存的方法是声明式的,在这种情况下,您需要在要缓存的页面上编写类似于以下内容的代码:
但如果您需要缓存整个站点,您必须在项目的所有页面或主页面上编写此代码。这是一种疯狂的做法。在这种情况下,您不能将所有配置存储在一个地方。每个页面都有自己的配置...
Global.asax可以帮助我,但我的网站包含约20个Web项目和大约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")]
这种方法很完美,但我想知道是否有其他方法可以实现这个目的。谢谢。