ASP.NET MVC: как вернуть статус 304 «Не изменен»? - PullRequest
18 голосов
/ 28 апреля 2011

ASP.NET MVC 3.0, IIS 7, .NET 4

У меня есть действие, которое возвращает данные, которые редко изменяются (почти статично).

Есть ли простой способ:

  1. вернуть 304 «Не изменено» из действия;
  2. включает в ответ метку времени последнего изменения.

Я использую return Content('my data'); для результата действия.

По сути, я хочу простой способ сделать то, о чем говорится в этой статье: http://weblogs.asp.net/jeff/archive/2009/07/01/304-your-images-from-a-database.aspx

Ответы [ 3 ]

15 голосов
/ 21 сентября 2012

(Очень!) Поздний ответ, но этот вопрос всплывает в верхней части результатов поиска, поэтому он может быть полезен для будущих людей, приземляющихся здесь.

Альтернатива части 1:

return new HttpStatusCodeResult(304, "Not Modified");
10 голосов
/ 28 апреля 2011

Что не так с этим для 304?

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

и это для LastModified:

        Response.Cache.SetLastModified(DateTime.Now);

Или, может быть, просто создайте «Не измененный» фильтр .

1 голос
/ 26 августа 2016

используя предоставленный материал, вы можете создать небольшую служебную функцию в вашем контроллере

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;
}

, а затем использовать ее следующим образом:

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