You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server频繁断开连接及数据加载异常问题求助

Blazor Server 站点频繁断开连接问题

环境与问题现象

  • 技术栈:基于Blazor + MudBlazor搭建个人作品集站点,包含待办模块和论坛页面,使用PostgreSQL数据库,部署在Digital Ocean的1GB RAM Docker容器中
  • 异常表现:仅2人触发查询操作,或在页面加载完成前切换页面时,会频繁出现服务器断开连接现象;虽3-5秒后自动重连,但已导致站点无法正常使用
  • 补充信息:站点数据量极小(仅8个项目、约30张自加载图片、5个标签、8位用户等),仅为简单的项目展示CRUD页面,但查询会冻结、无法自行取消并终止WebSocket连接,重连后可继续运行

相关查询代码

protected override async Task OnParametersSetAsync()
{
    cts.Cancel();

    cts = new CancellationTokenSource();
    filterText = "";

    try
    {
        await Task.WhenAll(
            LoadAssociatedData(cts.Token),
            LoadProjects(cts.Token)
        );
    }
    catch (Exception ex)
    {
        await ToastService.ShowErrorAsync($"Error loading Data: {ex.Message}");
    }
}

private async Task LoadAssociatedData(CancellationToken token)
{
    loading = true;
    try
    {
        await using var ctx = await DbContextFactory.CreateDbContextAsync();
        currentProjectType = await ctx.ProjectTypes
                                   .FirstOrDefaultAsync(x => x.ID == ProjectTypeId, token)
                                 ?? new Project_Type();
        allImages = await ctx.Images.AsNoTracking().ToListAsync(token);
        allTags   = await ctx.Tags.AsNoTracking().ToListAsync(token);
        allUsers  = await ctx.Users.AsNoTracking().ToListAsync(token);
    }
    catch (OperationCanceledException) { }
}

private async Task LoadProjects(CancellationToken token)
{
    try
    {
        // images saved on db and only their ID is pulled through a junction table to avoid 
        // large data transfer, and self loaded with a controller.

        await using var ctx = await DbContextFactory.CreateDbContextAsync();
        allProjects = await ctx.Projects
                               .AsNoTracking()
                               .Include(p => p.Images) 
                               .Include(p => p.Tags).ThenInclude(pt => pt.Tag)
                               .Include(p => p.Users).ThenInclude(u => u.User)
                               .Include(p => p.Type)
                               .Where(p => p.ProjectTypeID == ProjectTypeId)
                               .OrderBy(p => p.ProjectDisplayOrder ?? int.MaxValue)
                               .ToListAsync(token);
        projects = allProjects;
    }
    catch (OperationCanceledException) { }
    catch (Exception ex) when (!token.IsCancellationRequested)
    {
        await ToastService.ShowErrorAsync($"Error loading projects: {ex.Message}");
    }
    finally { loading = false; }
}

已尝试操作

已查阅过类似问题,但未找到确切解决方案,如需更多代码信息可提供。

内容的提问来源于stack exchange,提问作者Hakkology

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:05:01