Атрибут OutputCache игнорируется в MVC 3

Итак, у меня возникла проблема с тем, что IE 7 может загрузить файл с сайта SSL, созданного в MVC 3. Чтобы IE 7 мог сохранить файл с сайта SSL, он должен иметь возможность кэширования.

Код метода:

[OutputCache(Location = OutputCacheLocation.ServerAndClient, Duration = 20, VaryByParam = "none", NoStore = true )]
public override FileContentResult Export(int? id, string extra)
{
...
return new FileContentResult(byte[], mimetype);
}

Это работает в IE9, Chrome, Safari и Firefox. Я пробовал различные настройки для VaryByParam, Duration и NoStore. Когда я когда-либо меняю какие-либо из этих настроек, заголовки ответов никогда не меняются.

Cache-Control: без кеша, без хранения, с обязательной повторной проверкой

Content-Disposition: вложение; имя_файла=PersonalInfo-02092012.xlsx

Длина содержимого: 11933

Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Дата: Чт, 09 февраля 2012 г., 18:16:35 по Гринвичу

Истекает:-1

Прагма: без кеша

Сервер: Microsoft-IIS/7.5

Любая помощь будет оценена по достоинству.


person dougdieh    schedule 09.02.2012    source источник
comment
интересно - не знал о поведении IE здесь. Еще одна причина, по которой я сейчас избегаю IE: support.microsoft.com/kb/323308   -  person Adam Tuliper - MSFT    schedule 10.02.2012


Ответы (1)


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

Проблема заключалась в том, что пользовательский атрибут ActionFilterAttribute вручную устанавливал информацию о кеше, и поэтому кеширование, которое я устанавливал для действия, игнорировалось.

Рассматриваемый атрибут обрезан для краткости:

public class CustomAttributeName: ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        cache.SetValidUntilExpires(false);
        cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        cache.SetCacheability(HttpCacheability.NoCache);
        cache.SetNoStore();

        base.OnActionExecuting(filterContext);
    }
}
person dougdieh    schedule 10.02.2012