2009-04-28 14 views
7

Actualmente tengo el siguiente acción para volver archivos (imágenes, PDF, etc.) de mi DB:¿cómo puedo almacenar en caché FileContentResult para el rendimiento?

// 
    // GET: /FileManager/GetFile/ID 
    [OutputCache(Duration = 600, VaryByParam = "ID")] 
    public ActionResult GetFile(int ID) 
    { 
     FileService svc = new FileService(new SqlFileRepository(base.ConnectionString)); 

     KsisOnline.Data.File result = svc.GetFileByID(ID); 

     return File(result.Data, result.MimeType, result.UploadFileName); 
    } 

estoy usando el atributo OutputCache pero no sé si lo estoy usando correctamente o cómo optimizarlo para este propósito

Como el código es correcto, parece que tengo la funcionalidad de caché en Firefox (3) pero no en IE (7). Por alguna razón, IE solicita la imagen desde el DB cada vez (lo que es obviamente malo) y no sé cómo solucionarlo. Seguro que IE no es compatible con los estándares de forma adecuada, pero tal vez todavía no sigo algunas convenciones de caché preferidas. Realmente agradecería algo de ayuda con esto, así que obtengo visitas DB mínimas y soporte de almacenamiento en caché.

EDIT: Para ver el código anterior en la acción o al perfil usted mismo con navegadores/herramientas, consulte this link.

+0

posible duplicado de [Cómo volver estado 304 con FileResult en ASP.NET MVC RC1] (http://stackoverflow.com/questions/602104/how-return-304-status-with-fileresult-in-asp-net-mvc-rc1) –

Respuesta

2

Debe usar Fiddler para ver qué encabezados HTTP son enviados por IE y sus aplicaciones, ya que estos son diferentes de los de Firefox. Lo que debe tener es hacer que el navegador envíe el encabezado If-Modified-Since (y posiblemente un ETag) y su aplicación debe responder con el estado HTTP 302.

+0

tenía la esperanza de obtener la ayuda con las características de OutputCacheAttribute 1st. pero su sugerencia será invaluable para optimizar los encabezados HTTP. thanx –

+2

@ Anton ¿No quiere decir "responder con estado HTTP * 304 *"? 302 es una redirección –

4

Try ubicación utilización ServerAndClient:

[OutputCache (Duración = 600, VaryByParam = "ID", Localización = OutputCacheLocation.ServerAndClient)]

0
ControllerContext.HttpContext.Response.ClearHeaders() 
Cuestiones relacionadas