2016-03-22 4 views
2

У меня есть (рабочий) MVC-приложение, которое использует свойство сеанса на нескольких частях:сессия теряется при включении OutputCache

return httpContext.Session[SPContextKey] as SharePointAcsContext; 

(игнорировать, что это SharePoint, эта проблема не может быть SP-специфический)

Это работает хорошо, пока я пытаюсь включить Outputcaching:

[OutputCache (Duration =600)] 
public ActionResult Select() { 
    DoSelect(); 
} 

Когда содержание кэшируется, httpContext.Session становится NULL.

Есть ли способ сохранить данные сеанса, а также использовать кеширование?

+0

http://stackoverflow.com/questions/5447611/why-are-there-two-incompatible-session-state-types-in-asp-net может быть вам полезен – rashfmnb

ответ

1

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

Это привело меня к выводу, что код, вызывающий проблему, должен быть запущен перед кешем. И поэтому «плохого мальчика» было легко найти. Другой атрибут (в данном случае AuthorizeAttribute), который перед тем OutputCache-атрибут в коде по-прежнему работать, когда применяется кэширование, но не может получить доступ к сессии:

[Route("{id}")] 
[UserAuth(Roles =Directory.GroupUser)] 
[JsonException] 
[OutputCache(Duration = 600)] 
public ActionResult Select() 
{ 
    DoSelect(); 
} 

Ввод USERAUTH-атрибута НИЖЕ в OutputCache-Attribute решил проблему

Смежные вопросы