[英]How to organize custom caching in IIS module?
我正在尝试为ASP.net应用程序开发复杂的缓存。 但是,由于缺乏全面的文档,因此该任务的分配比原先预期的要复杂。
我已经创建了IIS模块,该模块订阅了HttpApplication
并假设已完成工作。 代码如下:
namespace Cache
{
using System;
using System.IO;
using System.Web;
public class Control : IHttpModule
{
#region Public Methods
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.ResolveRequestCache += onResolveRequestCache;
context.UpdateRequestCache+= onUpdateRequestCache;
}
#endregion Public Methods
#region Private Methods
private void onResolveRequestCache(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
// Get cached response body and fire response
}
private void onUpdateRequestCache(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
// Put response body to cache
}
#endregion Private Methods
}
}
但是我面临以下障碍:目前尚不清楚如果在缓存中找到对象,如何中断执行管道。 我发现了这两种方法: HttpApplication.Context.Response.End()
和HttpApplication.Context.Response.Flush()
都有各自的缺点,例如需要手动设置所有标头或在执行管道中触发所有后续事件,即使它们不需要。
有什么建议如何用从缓存提供程序接收的信息填充HttpApplication.Context.Response
主体,以及如何设置正确的标头(自动或多或少,也可能有选择地缓存它们)以及如何正确跳过执行管道步骤以实现最佳应用程序性能。
我考虑的整个方法是不正确的。
自定义缓存任务不应作为IIS模块解决,而应作为自定义缓存提供程序解决。
在以下文章中找到了如何创建此类解决方案的文档最多的示例: http : //msdn.microsoft.com/zh-cn/magazine/gg650661.aspx
但是,如果您使用的是已编译的ASP.NET应用程序并且无法将某些代码注入控制器,那么它不会回答如何控制缓存行为的问题。
而且,如果应该执行复杂而激进的缓存,则在这种情况下,IIS的自定义模块可能就是答案。
例如,我从问题代码中修改了onUpdateRequestCache
方法,以使每个请求都进入缓存:
private void onUpdateRequestCache(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
application.Context.Response.Cache.SetCacheability(HttpCacheability.Public); //Location="Any"
application.Context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(1800)); //Duration="1800"
application.Context.Response.Cache.SetValidUntilExpires(true);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.