嘿,我目前正在开发 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 和您可能需要作为会话状态的任何其他属性创建一个 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++;
}
}
我发现问题出在
MaximumReceiveMessageSize
,正如 @mauro 的评论中提到的。要解决此问题,请进入 Program.cs(在 .Web 项目中)添加以下代码行:
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.MaximumReceiveMessageSize = 10 * 1024 * 1024; // 10MB
});
上面的代码应该放在
builder.Build()
行之前。