簡體   English   中英

Blazor ProtectedSessionStorage 超時

[英]Blazor ProtectedSessionStorage timeout

嘿,我目前正在開發 blazor-server-app 並遇到了問題。

我使用受保護的會話存儲來保存我的數據。 如果鍵的值超過一定數量的字符 (34160),電路將開始嘗試重新連接並恢復。 但是,應用程序處於凍結狀態。

我嘗試訪問 OnInitializedAsync 方法中的存儲。

 protected override async Task OnInitializedAsync()
 {
    Warenkorb = await SessionStorageService.GetNotNull<Warenkorb>( SessionStorageKeys.WarenkorbKey );
 }

在 SessionStorageService 內部:

 public async Task<T> GetNotNull<T>( string key )
 {
    ProtectedBrowserStorageResult<string> result = await protectedSessionStorage.GetAsync<string>( key );
 }

調試器在“GetAsync(key)”處停止

對此有什么解釋嗎? 謝謝

我找不到解釋,但由於我遇到了同樣的問題,我最終采用了下一個解決方法:

使用 Guid Id 和您可能需要的任何其他屬性創建會話類作為會話狀態:

public class Session
    {
        public Guid Id { get; set; }
        public int Counter { get; set; }
    }

創建一個應用程序狀態類來維護 Session 的集合:

public class AppState
{
    public List<Session> Sessions { get; set; } = new();

    public Session AddSession() {
        var retval = new Session();
        Sessions.Add(retval);
        return retval;
    }

    public Session? Session(Guid? sessionId) => Sessions.FirstOrDefault(x => x.Guid == sessionId);
}

在 Program.cs 上將其注冊為單例服務:

var state = new TestState.Shared.AppState(http);
builder.Services.AddSingleton(sp => state);

創建一個 SessionProvider 組件,如果丟失,它將創建一個新的會話 n AppState,並將其 Id 保存在受保護的會話存儲中:

@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject ProtectedSessionStorage ProtectedSessionStore
@inject AppState AppState

@if (isLoaded)
{
    <CascadingValue Value="@this">
        @ChildContent
    </CascadingValue>
}
else
{
    <p>Loading...</p>
}

@code {
    [Parameter] public RenderFragment? ChildContent { get; set; }
    public Session? Session { get; set; }
    public bool isLoaded;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            var result = await ProtectedSessionStore.GetAsync<Guid>("sessionId");
            if (result.Success)
                Session = AppState.Session(result.Value);
            else
            {
                Session = AppState.AddSession();
                await ProtectedSessionStore.SetAsync("sessionId", Session.Guid);
            }
            isLoaded = true;
            StateHasChanged();
        }
    }
}

使用 SessionProvider 包裝 App.razor Router 組件:

<SessionProvider>
    <Router AppAssembly="@typeof(App).Assembly">
        <Found Context="routeData">
            <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
            <FocusOnNavigate RouteData="@routeData" Selector="h1" />
        </Found>
        <NotFound>
            <PageTitle>Not found</PageTitle>
            <LayoutView Layout="@typeof(MainLayout)">
                <p role="alert">Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</SessionProvider>

從任何頁面訪問會話屬性:

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<div>session id: @sessionProvider?.Session?.Id.ToString()</div>

<p role="status">Current count: @sessionProvider?.Session?.Counter</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    [CascadingParameter] public SessionProvider? sessionProvider { get; set; }

    private void IncrementCount()
    {
        if (sessionProvider?.Session != null)
            sessionProvider.Session.Counter++;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM