Blazor ProtectedSessionStorage 超时

问题描述 投票:0回答:2

嘿,我目前正在开发 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)”处

这有什么解释吗? 谢谢

asp.net blazor session-storage
2个回答
1
投票

我找不到解释,但由于我遇到了同样的问题,我最终找到了下一个解决方法:

使用 Guid Id 和您可能需要作为会话状态的任何其他属性创建一个 Session 类:

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

创建一个应用程序状态类来维护会话集合:

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++;
    }

}

0
投票

我发现问题出在

MaximumReceiveMessageSize
,正如 @mauro 的评论中提到的。要解决此问题,请进入 Program.cs(在 .Web 项目中)添加以下代码行:

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.MaximumReceiveMessageSize = 10 * 1024 * 1024; // 10MB
});

上面的代码应该放在

builder.Build()
行之前。

© www.soinside.com 2019 - 2024. All rights reserved.