ASP.NET MVC: Создание изображений в кэше браузера из действия

У меня есть метод действия, который возвращает файл и имеет только один аргумент ( id).

например

public ActionResult Icon(long id)
{
    return File(Server.MapPath("~/Content/Images/image" + id + ".png"), "image/png");
}

Я хочу, чтобы браузер автоматически кэшировал это изображение при первом обращении к нему, чтобы в следующий раз ему не приходилось загружать все данные.

Я пробовал использовать такие вещи, как OutputCacheAttribute и вручную установить заголовки в ответе, например:

[OutputCache(Duration = 360000)]

или

Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(Cache.NoAbsoluteExpiration); 

Но изображение все равно загружается каждый раз, когда я нажимаю F5 в браузере (я пробую его в Chrome и IE). (Я знаю, что оно загружено. каждый раз, потому что если я изменю изображение, оно также изменится в браузере).

Я вижу, что в HTTP-ответе есть некоторые заголовки, которые, по-видимому, должны работать:

Cache-Control: public, max-age = 360000

Content-Length: 39317

Content-Type: image / png

Дата: Вт, 31 января 2012 г. 23:20:57 GMT

Истекает: Вс, 5 февраля 2012 г., 03:20:56 GMT

Последнее изменение: Вт, 31 января 2012 г. 23:20:56 GMT

Но заголовки запросов имеют следующее:

Pragma: no-cac он

Есть идеи, как это сделать?

Большое спасибо

29
задан Ganesh Kamath - 'Code Frenzy' 18 July 2017 в 05:21
поделиться

2 ответа

Попробуйте этот код, он работает для меня

            HttpContext.Response.Cache.SetCacheability(HttpCacheability.Public);
            HttpContext.Response.Cache.SetMaxAge(new TimeSpan(1, 0, 0));

            Entities.Image objImage = // get your Image form your database

            string rawIfModifiedSince = HttpContext.Request.Headers.Get("If-Modified-Since");
            if (string.IsNullOrEmpty(rawIfModifiedSince))
            {
                // Set Last Modified time
                HttpContext.Response.Cache.SetLastModified(objImage.ModifiedDate);
            }
            else
            {
                DateTime ifModifiedSince = DateTime.Parse(rawIfModifiedSince);


                // HTTP does not provide milliseconds, so remove it from the comparison
                if (objImage.ModifiedDate.AddMilliseconds(
                            -objImage.ModifiedDate.Millisecond) == ifModifiedSince)
                {
                    // The requested file has not changed
                    HttpContext.Response.StatusCode = 304;
                    return Content(string.Empty);
                }
            }

            return File(objImage.File, objImage.ContentType);
14
ответ дан 28 November 2019 в 01:56
поделиться

Просто, чтобы вы знали, что я обнаружил, и хотели бы получить объяснение или дополнительную информацию о том, как я могу рассказать.

Это: Response.Cache.SetCacheability (HttpCacheability.Public); Response.Cache.SetExpires (Cache.NoAbsoluteExpiration);

фактически кеширует изображения .....

, чтобы доказать это ... тест с отладкой ... поставить точку останова на контроллере изображения ... и вы увидите, что он не будет поражен один раз ... даже если вы F5 a пару раз ... но что странно для меня, так это то, что ответ 200 все еще возвращается.

Уберите эти строки, и вы увидите, что снова начнете достигать своей точки останова.

Мой вопрос: как правильно сказать, что это изображение является сервером из кэша, если вы все еще получаете ответ 200.

, и это было тестирование с IIS Express 8. встроенный IIS для Visual Studio не GD ..

0
ответ дан 28 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: