У меня есть метод действия, который возвращает файл и имеет только один аргумент ( 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 он
Есть идеи, как это сделать?
Большое спасибо
Попробуйте этот код, он работает для меня
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);
Просто, чтобы вы знали, что я обнаружил, и хотели бы получить объяснение или дополнительную информацию о том, как я могу рассказать.
Это: Response.Cache.SetCacheability (HttpCacheability.Public); Response.Cache.SetExpires (Cache.NoAbsoluteExpiration);
фактически кеширует изображения .....
, чтобы доказать это ... тест с отладкой ... поставить точку останова на контроллере изображения ... и вы увидите, что он не будет поражен один раз ... даже если вы F5 a пару раз ... но что странно для меня, так это то, что ответ 200 все еще возвращается.
Уберите эти строки, и вы увидите, что снова начнете достигать своей точки останова.
Мой вопрос: как правильно сказать, что это изображение является сервером из кэша, если вы все еще получаете ответ 200.
, и это было тестирование с IIS Express 8. встроенный IIS для Visual Studio не GD ..