最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - Blazor Interactive Server: Error 400 when trying to connect via websocket - Stack Overflow

programmeradmin4浏览0评论

I am trying to enforce Blazor Interactive Server to use WebSocket only to be able to use it in a load balanced setting. Sticky Session cannot be used due to IT Policy.

When I try running it locally, it works. However, when testing it in one of our Testing environment (which has no load balancer), it returns a 400 error:

wss://<Page>/<Subdirectory>/<BlazorHomePage>/_blazor
400 Bad Request

In the Client Browser, it gives this error in the console:

Error: Failed to start the connection: Error: WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.

I can't test it in a load balance setting if it doesn't get past the first Testing environment. Does anyone have a solution for this error?

This is what I have in Program.cs to be able to setup the Transport:

app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntifery();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.MapBlazorHub(e =>
{
    e.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets;
}).WithOrder(-1);

app.Run();

I've added Blazor.start to configure for WebSocket transport in App.razor:

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <base href="@BaseUrl" />
    <link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
    <link rel="stylesheet" href="app.css" />
    <link rel="stylesheet" href="BaseBlazorApp.styles.css" />
    <link rel="icon" type="image/png" href="favicon.png" />
    <HeadOutlet @rendermode="InteractiveServer" />
</head>

<body>
    <Routes @rendermode="InteractiveServer" />
    <script src="_framework/blazor.web.js" autostart="false"></script>
    <script>
        Blazor.start({
            circuit: {
                configureSignalR: function (builder) {
                    builder.withUrl("_blazor", {
                        skipNegotiation: true,
                        transport: 1
                    });
                }
            }
        })
    </script>
</body>

Another thing to note is that I have the <base> set up differently from a standard Blazor project to be able to run the app in a subdirectory without issue, and has been working before.

发布评论

评论列表(0)

  1. 暂无评论