Отключение кэширования на стороне сервера для ChildActions в ASP.NET MVC 3 ИЛИ зависит от клиента - PullRequest
0 голосов
/ 14 июня 2011

Я разрабатываю интрасеть, в которой у меня есть 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.

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Вы можете попытаться принудительно установить местоположение кэша для клиента, чтобы у каждого пользователя (клиента) была своя собственная версия кэширования.

[OutputCache(Duration=3, Location=OutputCacheLocation.Client)]
0 голосов
/ 22 апреля 2013

Вы захотите использовать атрибут VaryByCustom Кэширования вывода. Это позволит вам иметь уникальную кешированную версию для каждого пользователя (или какой-либо другой уникальный ключ кеша, который вы определите).

...