繁体   English   中英

如何在IIS模块中组织自定义缓存?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM