¿Cómo almacenar en caché la salida del método de acción que devuelve la imagen a la vista en asp.net mvc?
Ya he leído un montón de publicaciones sobre almacenamiento en caché, pero ninguna de ellas coincide exactamente con mis necesidades. En mi aplicación mvc 3 tengo un método de acción GetImage () que devuelve un archivo de tipo de imagen. Luego uso este método en una vista para mostrar la imagen:
<img width="75" height="75" src="@Url.Action("GetImage", "Store", new {productId = item.ProductId})"/>
Quiero cachear imágenes en un servidor. Entonces, lo que ya he intentado:
1) para utilizar el atributo de salida de caché:
[HttpGet, OutputCache(Duration = 10, VaryByParam = "productId", Location = OutputCacheLocation.Server, NoStore = true)]
public FileContentResult GetImage(int productId)
{
var p = _productRepository.GetProduct(productId);
if (p != null)
{
if (System.IO.File.Exists(GetFullProductImagePath(productId)))
{
var image = Image.FromFile(GetFullProductImagePath(productId));
return File(GetFileContents(image), "image/jpeg");
}
}
var defaultPath = AppDomain.CurrentDomain.BaseDirectory +
ConfigurationManager.AppSettings["default-images-directory"];
var defaultImage = Image.FromFile(Path.Combine(defaultPath, "DefaultProductImage.jpg"));
return File(GetFileContents(defaultImage), "image/jpeg");
}
Las imágenes no están en caché (me sale el estado: 200 OK)
2) para usar los siguientes métodos de Response.Cache en un método GetImage ():
public FileContentResult GetImage(int productId)
{
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0, 10));
Response.Cache.SetExpires(DateTime.Now.Add(new TimeSpan(0, 0, 0, 10)));
Response.Cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
// other code is the same
}
Las imágenes no son cacheadas
3) Aquí obtengo: 304 No modificado, pero el método GetImage () no devuelve nada (imagen vacía)
public FileContentResult GetImage(int productId)
{
Response.StatusCode = 304;
Response.StatusDescription = "Not Modified";
Response.AddHeader("Content-Length", "0");
// other code is the same
}
Pregunta: ¿Cómo almacenar en caché la salida de este método de acción en un servidor?