我正在使用ImageResizing庫來調整大小並在我的C#Mvc應用程序中傳遞圖像。在MVC應用程序中緩存圖像的正確方法
有一件事情沒有發生,雖然我的圖片沒有被緩存。
我很努力去理解爲每幅圖像適當地添加緩存需要什麼。
我只需要知道我是否在寫軌道?這會緩存我的圖片嗎?
我想我需要做的,是集FinalContentType,並FinalContentType在我ImageResizer_OnPostAuthorizeRequestStart(我不知道從哪裏得到這些值)
然後,我希望在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);
}
}
'OutputCacheAttribute'沒有做你想做的事嗎?鏈接:http://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute(v=vs.108).aspx –
這些圖像在運行時由庫重新調整,以便緩存屬性不起作用,也是我特別想要緩存的圖像。 – shenku
爲什麼它不工作? MSDN表示它將緩存內存中的操作方法的輸出。從本質上講,我明白,無論寫到響應中的任何內容都被保存在內存中,那就是你的二進制圖像數據。 –