Problem z sygnalizatorem .NetCore 2.2

Sep 17 2020

Mam pewne problemy z projektem, który próbuje użyć sygnalizującego do wywołania żądania odczytu źródła danych do wszystkich podłączonych klientów w celu odświeżenia danych siatki, aby użytkownicy widzieli aktualizacje w czasie rzeczywistym.

Działa to lokalnie IIS Express podczas działania w programie Visual Studio przy użyciu dwóch otwartych okien chrome. SignalR łączy się w obu oknach i wywołuje wykonanie odczytu źródła danych bez błędu podczas modyfikowania w dowolnym oknie przeglądarki.

Po wdrożeniu na serwerze z usługami IIS 10.0.17763.1 pojawiają się błędy.

Aplikacja jest hostowana na jednym serwerze, a jeśli okno przeglądarki jest otwarte, połączenie z SignalR działa (otrzymuję dziennik konsoli połączonego z wywołania await connection.start). Ale kiedy drugie okno przeglądarki jest otwierane lub otwierane na innym komputerze, wiele błędów dla SingalR zaczyna pojawiać się w konsoli dla każdej instancji przeglądarki.

Błędy są następujące:

Przeglądarka internetowa 1:

    https://FQDN:2424/trafficWorkflowHub?id=YPCykB9G94tbgzlnZZDi5g 404 (Not Found) 
    Error: Server returned handshake error: An unexpected error occurred during connection handshake. 
    InvalidDataException: Missing required property 'protocol'. Message content: {"arguments": 
   [],"invocationId":"1","target":"UpdateDataSource","type":1} 
    TrafficWorkflow:181 Error: Not Found
        at new HttpError (signalr.js:1487)
        at XMLHttpRequest.xhr.onload (signalr.js:1777)
    TrafficWorkflow:182 connected

Maszyna z przeglądarką 2:

 signalr.js:3927 WebSocket connection to 'wss://FQDN:2424/trafficWorkflowHub?id=2sW4zudCQKoysUQB9mB1vQ' 
failed: Error during WebSocket handshake: Unexpected response code: 404
signalr.js:2684 [2020-09-17T10:57:34.529Z] Information: SSE connected to 
https://FQDN:2424/trafficWorkflowHub?id=E9M_Wkbpt1KBPcHxLHhJXA
signalr.js:1788 POST https://FQDN:2424/trafficWorkflowHub?id=E9M_Wkbpt1KBPcHxLHhJXA 404 (Not Found)
signalr.js:2678 [2020-09-17T10:57:34.060Z] Error: Failed to start the transport 'WebSockets': null

Przykład kodu znajduje się poniżej.

Kod po stronie klienta:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/trafficWorkflowHub")
    .build();

async function start() {
    try {
        await connection.start().catch(err => console.error(err));
        console.log("connected");
    } catch (err) {
        console.log(err);
        setTimeout(() => start(), 5000);
    }
}

connection.onclose(async () => {
    await start();
});


connection.on("ReceiveUpdates", function () {
    callDataSourceRead();
});

start() znajduje się w sekcji Dokument gotowy.

wywołanie wywołań aktualizacji źródła danych na stronach cshtml za pomocą tego wywołania:

 connection.invoke("UpdateDataSource").catch(function (err) {
                    return console.error(err.toString());
                });

Kod po stronie serwera jest następujący:

  public class TrafficWorkflowHub : Hub
    {

        public async Task UpdateDataSource()
        {
            await Clients.All.SendAsync("ReceiveUpdates");
        }

    }

W Startup.cs Public void Configure

app.UseSignalR(routes =>
            {
                routes.MapHub<TrafficWorkflowHub>("/trafficWorkflowHub");
           
            });

Publiczna void ConfigureServices

  services.AddSignalR(hubOptions =>
            {
                hubOptions.EnableDetailedErrors = true;
            });

Odpowiedzi

Kiril1512 Sep 17 2020 at 20:04

Upewnij się, że konfigurujesz CORS w ten sposób (kolejność jest ważna):

services.AddCors(options =>
{
    options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://yourFrameworkApp.azurewebsites.com")
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials()
        .SetIsOriginAllowed((host) => true));
});

A następnie upewnij się, że masz je na metodzie konfiguracji podczas uruchamiania:

app.UseHttpsRedirection();
app.UseWebSockets();

I nie zapomnij włączyć gniazd sieciowych na serwerze: