Как я кеширую FileContentResult для производительности? - PullRequest
7 голосов
/ 28 апреля 2009

В настоящее время у меня есть следующие действия для возврата файлов (изображений, PDF и т. Д.) Из моей БД:

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

Я использую атрибут OutputCache, но я не знаю, правильно ли я его использую или как его оптимизировать для этой цели.

Поскольку код стоит, я, кажется, получаю функциональность кэша в Firefox (3), но не IE (7). По какой-то причине IE каждый раз запрашивает образ из БД (что, очевидно, очень плохо), и я не знаю, как это исправить. Конечно, IE не поддерживает стандарты должным образом, но, возможно, я все еще не следую некоторым предпочтительным соглашениям о кэшировании. Я был бы очень признателен за помощь в этом, поэтому я получаю минимальное количество обращений к БД и поддержку кеширования кросс-браузера.

EDIT: Чтобы увидеть приведенный выше код в действии или профилировать его самостоятельно с помощью браузеров / инструментов, см. эту ссылку .

Ответы [ 3 ]

4 голосов
/ 05 мая 2009

Попробуйте использовать расположение ServerAndClient:

[OutputCache (Duration = 600, VaryByParam = "ID", Location = OutputCacheLocation.ServerAndClient)]

2 голосов
/ 28 апреля 2009

Вам нужно использовать Fiddler , чтобы увидеть, какие заголовки HTTP отправляются IE и вашими приложениями, чем они отличаются от заголовков для Firefox. Вам нужно сделать так, чтобы браузер отправлял заголовок If-Modified-Since (и, возможно, ETag), и ваше приложение должно отвечать статусом HTTP 302.

0 голосов
/ 03 августа 2010
ControllerContext.HttpContext.Response.ClearHeaders()
...