Я разрабатываю интрасеть, в которой у меня есть PartialView, обновляющийся каждые x секунд (3 для целей отладки) через jQuery.В то же время я использую директиву [OutputCaching(Duration = 3)]
в действии PartialView.
Для обновления используется следующий сценарий:
<script type="text/javascript">
$(document).ready(function () {
setInterval(function () {
$("#partial_1").load('@Url.Action("_News", "Home", new { id = 1 })');
}, 3000);
});
</script>
Где действие _News в настоящее время выглядит следующим образом:
[OutputCache(Duration=3)]
public ActionResult _News(int id)
{
/* random stuff to get news AND the reason why it should be on per-client-basis
is that this also contains logic for authentification
*/
return PartialView();
}
Все это прекрасно работает, если только один пользователь.
Проблема возникает, когда несколько пользователей получают доступ к странице, поскольку все пользователи видят одну и ту же версию.
Полное отключение кэширования вывода для этого действия будет работать, но простое удаление директивы [OutputCaching] не работает.Если я это сделаю, загружается кэшированная версия частичного представления каждый раз, когда происходит обновление jQuery.Единственный способ, которым я могу изменить, какая версия частичного вида кэшируется, это загрузить частичное представление напрямую, используя /_News/Home/
Атрибут NoStore недопустим для ChildActions, поэтому это тоже не решение.атрибут VaryByParam, но я не уверен, как реализовать это, чтобы варьироваться в зависимости от пользователя, где в этом случае будет достаточно User.Identity.