javascript Blazor服务器:仅在Firefox中出现“未捕获(承诺中)WebSocket未处于打开状态”错误

pjngdqdw  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(171)

我们编写了一个Blazer Server应用程序(.NET 7.0),托管在Windows Server 2019的IIS 10上。该应用程序在最新版本的Chrome或Edge下运行良好。然而,我们的一些用户使用最新版本的Firefox,他们偶尔无法加载应用程序的页面。我找不到无法加载的原因,此外,它更有可能发生的时间越长,你使用的应用程序.
在使用应用程序时保持开发人员控制台打开,当网站加载失败时,我注意到以下情况:Uncaught (in promise) WebSocket is not in the OPEN stateUncaught (in promise) Error: cannot send data if the connection is not in the 'Connected' State.
我偶尔也会在Chrome的开发者控制台中注意到一个101 Switching Protocols请求被发送,响应头为200,其中包含Upgrade: websocket。我不知道这是否意味着SignalR在某种程度上失败了,“原始”WebSockets被用作Chrome的后备,也许这表明Firefox在尝试后备时失败了?
我已经通过Firefox中的about:config确认network.http.http2.websockets设置为true。我还重新启动了IIS Web服务器,以防导致问题,并确认WebSockets已作为IIS的一部分安装。
除此之外,我对SignalR和WebSockets(这是我们的第一个Blazor服务器应用程序)非常不熟悉,我在谷歌上搜索和审查堆栈溢出没有发现任何相关的东西。
我的基本理解是,我们希望一般使用SignalR,它碰巧在幕后使用WebSockets,但我们不希望使用“原始WebSockets”(微软在this page中称之为“原始WebSockets”)。我还认为Blazor Server使用SignalR时不需要额外配置,但也许我们一直都在错误配置它,只是依赖于后备。
如果有用的话,这里是我们的Program.cs

using Microsoft.EntityFrameworkCore;
using miniDARTS.Data;
using MudBlazor.Services;
using Microsoft.AspNetCore.Authentication.Negotiate;
using miniDARTS.Services;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

// Blazor Server doesn't include HttpClient service by default.
builder.Services.AddHttpClient();

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

// Configure the database connection.
string connectionString = "";

if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production")
{
    connectionString = builder.Configuration.GetConnectionString("miniDARTSContext");
}   

else if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development")
{
    connectionString = builder.Configuration.GetConnectionString("testing");
}

var serverVersion = new MySqlServerVersion(new Version(8, 0, 28));
builder.Services.AddDbContextFactory<miniDARTSContext>(options => options.UseMySql(connectionString, serverVersion), ServiceLifetime.Scoped);

// Only run cron jobs if they are in a production environment.
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production")
{
    IHost host = Host.CreateDefaultBuilder(args)
        .ConfigureServices(services =>
        {
            services.AddHostedService<ScopedBackgroundService>();
            services.AddScoped<IScopedProcessingService, PhaseChangeReportService>();
        })
        .Build();

    host.RunAsync();
}

// Add MudBlazor services.
builder.Services.AddMudServices();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();
0g0grzrc

0g0grzrc1#

非常具体的问题,可能是一个火狐错误,但这里有几件事,我能想到的,可以检查:

  1. IIS管理器-〉您的站点-〉管理部分-〉配置编辑器-〉部分下拉列表-〉system.webServer/WebSocket -〉enabled是否设置为true
  2. IIS管理器-〉您的站点-〉操作窗格-〉高级设置-〉确保“.NET CLR版本”设置为正确的版本(例如,对于.NET 7. 0,“.NET CLR版本v4. 0. 30319”)
    1.也许可以尝试配置SignalR使用长轮询作为回退传输,这在WebSocket连接不稳定或不受支持的情况下会有所帮助?可以在_Host.cshtml中实现:
<script>
      Blazor.start({
          configureSignalR: function (builder) {
              builder.withUrl('/_blazor', { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling });
          }
      });
  </script>```

相关问题