[英]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.