在MVC应用程序中缓存图像的正确方法

时间:2012-12-20 04:20:50

标签: c# asp.net-mvc imageresizer

我正在使用ImageResizing库,在C#Mvc应用程序中调整大小并传送图像。

但有一点没有发生,我的图像没有被缓存。

我很难理解为每张图片适当添加缓存需要什么。

我只需要知道我是否在写作轨道上?这会正确缓存我的图像吗?

我认为我需要做的是在我的ImageResizer_OnPostAuthorizeRequestStart中设置FinalContentType和FinalContentType(我不知道从哪里获取这些值)

然后,我希望在Application_PreSendRequestHeaders中我可以使用下面的代码正确设置缓存头。

我使用了here所述方法的修改版本。

这是我的代码:

 private static void ImageResizer_OnPostAuthorizeRequestStart(IHttpModule sender2, HttpContext context)
        {
            string path = Config.Current.Pipeline.PreRewritePath;
            if (!path.StartsWith(PathUtils.ResolveAppRelative("~/s3"), StringComparison.OrdinalIgnoreCase)) return;
        Config.Current.Pipeline.SkipFileTypeCheck = true;
        Config.Current.Pipeline.ModifiedQueryString["cache"] = ServerCacheMode.Always.ToString();
    }

    protected void Application_PreSendRequestHeaders(Object source, EventArgs e)
    {
        var app = source as HttpApplication;

        HttpContext context = (app != null) ? app.Context : null;

        if (context != null && context.Items != null && context.Items["FinalContentType"] != null && context.Items["LastModifiedDate"] != null)
        {
            //Clear previous output 
            //context.Response.Clear(); 
            context.Response.ContentType = context.Items["FinalContentType"].ToString();

            //FinalContentType is set to image/jpeg or whatever the image mime-type is earlier in code. 
            //Add caching headers 
            int mins = 1; //Or Configuration.AppSettings['whatever'] 

            if (mins > 0)
            {
                context.Response.Expires = 1;
            }

            var lastModified = (DateTime?)context.Items["LastModifiedDate"]; //Set earlier in code. 

            if (lastModified != DateTime.MinValue)
            {
                Response.Cache.SetLastModified(lastModified.Value);
            }

            Response.Cache.SetCacheability(context.Request.IsAuthenticated ? HttpCacheability.Private : HttpCacheability.Public);
        }

    }

1 个答案:

答案 0 :(得分:4)

使用DiskCache和ClientCache插件分别处理磁盘缓存和缓存标头。

ASP.NET输出缓存在这里没用。