MemoryCache TryGetValue всегда возвращает false

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

@page "/"
@layout EmptyLayout
@inject NavigationManager NavigationManager
@inject IMemoryCache MemoryCache

@code {
    protected override void OnInitialized() {
        base.OnInitialized();

        string? token;
        bool tokenPresent = MemoryCache.TryGetValue("token", out token); // Here the token is null

        if ( tokenPresent )
            NavigationManager.NavigateTo("menu");
        else
            NavigationManager.NavigateTo("signin");
    }
}

Экран входа вызывает службу при отправке, класс с этим методом в этой службе выглядит следующим образом:

public class AuthorizationService : IAuthorizationService {
    private readonly HttpClient _httpClient;
    private readonly IMemoryCache _memoryCache;

    public AuthorizationService(HttpClient httpClient, IMemoryCache memoryCache) {
        _httpClient = httpClient;
        _memoryCache = memoryCache;
    }

    public async Task<(bool, string?)> Signin(SigninDto input) {
        var response = await _httpClient.PostAsJsonAsync("api/user/signin", input);
        string content = await response.Content.ReadAsStringAsync();
        if ( response.IsSuccessStatusCode == false ) {
            return (false, ErrorDto.FromJson(content)!.ErrorMessage);
        }

        TokenDto token = TokenDto.FromJson(content)!;

        _memoryCache.Set("token", token.Token, token.Role == "Admin" ? TimeSpan.FromDays(1) : TimeSpan.FromDays(30));

        string? foundToken;
        _memoryCache.TryGetValue("token", out foundToken); // Here the token is not null

        return (true, token.Token);
    }
}

Для получения дополнительной информации. В моем запуске я регистрирую свое кэширование и AuthorizationService следующим образом:

builder.Services.AddMemoryCache();

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<IAuthorizationService, AuthorizationService>();

Моя проблема в том, что в TryGetValue в ResolveAuthorizationScreen всегда возвращается значение null, и я не знаю, почему. Я предполагаю, что это как-то связано с тем фактом, что кеш памяти является одноэлементным экземпляром, и что-то идет не так, потому что я ввожу в два разных места. Что я делаю неправильно и как это исправить, чтобы TryGetValue не возвращал false, когда я ожидаю, что он вернет true?

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

fuzzybear 03.04.2023 03:12

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

Danny Verdel 03.04.2023 07:49

если мы удалим авторизацию из уравнения и установим кеш, он там?

fuzzybear 03.04.2023 20:42

@fuzzybear, извините за задержку. Да, когда я устанавливаю его перед TryGetValue, он там.

Danny Verdel 18.04.2023 12:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял, что MemoryCache — это временное хранилище на время жизни программы. Вместо этого я использовал localStorage, и это было решением.

Другие вопросы по теме