Asp.Net Core Cache Tag Helper - PullRequest
       1

Asp.Net Core Cache Tag Helper

0 голосов
/ 01 октября 2018

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

    <cache vary-by="@userService.ProfileChanged">
    <header class="header">
    <nav class="navbar fixed-top navbar-light bg-light d-flex justify-content-between">
        <ul class="main-nav-icons list-unstyled d-flex flex-fill mr-3">
            <cache vary-by="@userService.PinnedDashboardsChanged">
                @await Component.InvokeAsync("UserDashboards", new { type = "pinned" })
            </cache>
            <li><button class="btn btn-unstyled left-nav-toggler"><i class="glyphicons glyphicons-option-horizontal text-primary1"></i></button></li>
        </ul>
        <cache vary-by="@userService.ProfileChanged">
            <ul class="d-flex justify-content-end align-items-center user-menu mb-0 flex-fill list-unstyled">
                <li>
                    <ul class="user-menu-details d-flex mr-2 list-unstyled mb-0 flex-column flex-md-row">
                        <li class="list-inline-item">@(userService.User.UserTypeId == 1 ? "Dios Kernel" : userService.User.Environment.Name)</li>
                        <li class="list-inline-item"> <a href="@Url.Action("Index", "Profile")">@userService.User.FullName</a></li>
                    </ul>
                </li>
                <li class="list-inline-item user-avatar">
                    <div class="dropdown">

                        <a class="dropdown-toggle avatar-img" data-toggle="dropdown" style="background-image:url('@(string.IsNullOrEmpty(userService.User.ProfilePhoto) ? "/images/user-pic.png" : userService.User.ProfilePhoto)')">
                            @*<img src="@(string.IsNullOrEmpty(userService.User.ProfilePhoto) ? "/images/user-pic.png" : userService.User.ProfilePhoto)" alt="@userService.User.FullName">*@
                        </a>

                        <div class="dropdown-menu">
                            <a class="dropdown-item" onclick="editProfile('@Url.Action("_Edit","Profile")')">
                                <i class="fas fa-user-alt"></i>
                                Edit Profile
                            </a>
                            <a class="dropdown-item" onclick="resetPassword('@Url.Action("_ResetPassword","Account")')">
                                <i class="fas fa-lock"></i>
                                Change Password
                            </a>
                            <a class="dropdown-item" href="@Url.Action("Logout","Account")">
                                <i class="fas fa-sign-out-alt"></i>
                                Logout
                            </a>
                        </div>
                    </div>
                </li>
            </ul>
        </cache>
    </nav>
</header>
</cache>

Я использовал переменное свойство и свойство ProfileChanged, которое я изменяю true, когда пользователь обновляет профиль, но когда я сталкиваюсь со странным поведением, котороепервое обновление на любой странице показывает новое изменение, а на другом - нет, я ожидаю, что первый запрос после изменения повторно выполнит навигацию для всех других страниц.

1 Ответ

0 голосов
/ 01 октября 2018

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

В этом примере я сделал простой основной проект .net, где страница бритвы принимает 2 параметра int a иbool b в запросе маршрута.

В виде бритвы у меня будет следующее:

<cache vary-by="@a">
    Time at @a @DateTime.Now;
</cache>
<br />
<cache vary-by="@b">
    Time at @b @DateTime.Now;
</cache>

Теперь давайте рассмотрим некоторые результаты

  1. 1-й запрос, Запрос: ?a=1&b=true Время в 1 01/10/2018 19: 31: 11 ;Время в истине 01/10/2018 19: 31: 11 ;
  2. 2-й запрос, запрос: ?a=2&b=true Время в 2 01/10/2018 19:31:20;Время в True 01/10/2018 19: 31: 11 ;
  3. 3-й запрос, Запрос: ?a=2&b=false Время в 2 01/10/2018 19:31:20;Время в False 01/10/2018 19: 31: 32 ;
  4. 4-й запрос, Запрос: ?a=1&b=false Время в 1 01/10/2018 19:31:11;Time at False 01/10/2018 19: 31: 32 ;

Теперь, чтобы решить вашу проблему.Вы должны установить значение ProfileChanged для отметки времени, в противном случае, если вы не сохраните ее в базе данных, когда значение по умолчанию ProfileChanged будет установлено обратно на false после обновления, вы останетесь с ранее кэшированнымрезультат для ключа false , который хранится в течение 20 минут по умолчанию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...