我们编写了一个Blazer Server应用程序(.NET 7.0),托管在Windows Server 2019的IIS 10上。该应用程序在最新版本的Chrome或Edge下运行良好。然而,我们的一些用户使用最新版本的Firefox,他们偶尔无法加载应用程序的页面。我找不到无法加载的原因,此外,它更有可能发生的时间越长,你使用的应用程序.
在使用应用程序时保持开发人员控制台打开,当网站加载失败时,我注意到以下情况:Uncaught (in promise) WebSocket is not in the OPEN state
和Uncaught (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();
1条答案
按热度按时间0g0grzrc1#
非常具体的问题,可能是一个火狐错误,但这里有几件事,我能想到的,可以检查:
enabled
是否设置为true
?1.也许可以尝试配置SignalR使用长轮询作为回退传输,这在WebSocket连接不稳定或不受支持的情况下会有所帮助?可以在
_Host.cshtml
中实现: