2011-04-27 13 views
17

ASP.NET MVC 3.0, IIS 7, .NET 4ASP.NET MVC: ¿cómo devuelvo el estado 304 "No modificado"?

I tienen una acción que devuelve datos que rara vez cambia (casi estática).

¿Hay una manera fácil:

  1. retorno 304 "Not Modified" de la acción;
  2. incluyen la marca de tiempo "Last-Modified" en la respuesta.

Uso return Content('my data'); para el resultado de la acción.

Básicamente quiero una manera fácil de hacer lo que se habla en este artículo: http://weblogs.asp.net/jeff/archive/2009/07/01/304-your-images-from-a-database.aspx

+0

Preguntas y respuestas similares para .NET core se pueden encontrar [en esta pregunta] (https://stackoverflow.com/questions/43351192/how-to-return-a-304-result- from-asp-net-core-web-api) – GolezTrol

Respuesta

14

(Muy!) Respuesta tardía, pero esta pregunta aparece cerca de la parte superior en los resultados del motor de búsqueda por lo que podría ser útil para las futuras personas que desembarquen aquí.

alternativa para la parte 1:

return new HttpStatusCodeResult(304, "Not Modified"); 
10

¿Cuál es incorrecto con esto por 304?

 Response.StatusCode = 304; 
     Response.StatusDescription = "Not Modified"; 
     return Content(String.Empty); 

y esto por LastModified:

 Response.Cache.SetLastModified(DateTime.Now); 

O tal vez sólo crear un 'Not Modified' Filter.

+0

escribiendo demasiado. Tengo la esperanza de que haya una forma integrada de hacerlo, algo así como: 'return NotModified (myResource.LastModified);' –

+3

más importante aún necesito verificar y analizar "If-Modified-Since" en la solicitud, y eso se ha vuelto demasiado complejo para mi. –

+0

"Filtro '' no modificado ''. el enlace está roto – Simon

1

utilizar el material proporcionado, se puede construir una función de utilidad pequeña en su controlador

protected bool CheckStatus304(DateTime lastModified) 
{ 
    //http://weblogs.asp.net/jeff/304-your-images-from-a-database 
    if (!String.IsNullOrEmpty(Request.Headers["If-Modified-Since"])) 
    { 
     CultureInfo provider = CultureInfo.InvariantCulture; 
     var lastMod = DateTime.ParseExact(Request.Headers["If-Modified-Since"], "r", provider).ToLocalTime(); 
     if (lastMod == lastModified.AddMilliseconds(-lastModified.Millisecond)) 
     { 
      Response.StatusCode = 304; 
      Response.StatusDescription = "Not Modified"; 
      return true; 
     } 
    } 

    Response.Cache.SetCacheability(HttpCacheability.Public); 
    Response.Cache.SetLastModified(lastModified); 

    return false; 
} 

luego usarlo como esto:

if (CheckStatus304(image.CreatedDate)) return Content(string.Empty); 
Cuestiones relacionadas