Проблема с сигналом .NETCore 2.2

#.net-core #signalr #asp.net-core-2.1 #asp.net-core-signalr

#.net-core #signalr #asp.net-core-2.1 #asp.net-core-signalr

Вопрос:

У меня возникли некоторые проблемы с проектом, который пытается использовать SignalR для вызова запроса на чтение источника данных для всех подключенных клиентов для обновления данных сетки, чтобы пользователи видели обновления в режиме реального времени.

Это работает локально IIS Express при запуске в Visual Studio с использованием двух открытых окон Chrome. SignalR подключается в обоих окнах и вызывает выполнение чтения источника данных без ошибок при изменении в любом окне браузера.

При развертывании на сервере под управлением IIS 10.0.17763.1 появляются ошибки.

Приложение размещено на одном сервере, и если открыто окно браузера, соединение с SignalR работает (я получаю журнал подключений консоли из вызова await connection.start). Но когда второе окно браузера открывается или открывается на другом компьютере, в консоли для каждого экземпляра браузера начинают появляться множественные сбои для SingalR.

Ошибки заключаются в следующем:

Браузерная машина 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
  

Браузерная машина 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
  

Пример кода приведен ниже.

Код на стороне клиента:

 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() находится в разделе «Готовый документ».

вызов вызовов для обновления источника данных на страницах cshtml с помощью этого вызова:

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

Код на стороне сервера выглядит следующим образом:

   public class TrafficWorkflowHub : Hub
    {

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

    }
  

В Startup.cs
Общедоступная пустая настройка

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

Общедоступные пустые конфигурационные сервисы

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

Комментарии:

1. Здравствуйте. Добро пожаловать в stackoverflow. Как вы настраиваете CORS в своем серверном интерфейсе?

2. в startup.cs в разделе настройка как app.UseCors(builder => { builder. С исходными данными («ПОЛНОЕ доменное имя: 2424/» ) .AllowAnyHeader() .С методами («ПОЛУЧИТЬ», «ОПУБЛИКОВАТЬ») .allowCredentials(); });

Ответ №1:

Убедитесь, что вы настроили CORS следующим образом (порядок важен):

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

А затем убедитесь, что они есть в методе настройки при запуске:

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

И не забудьте включить веб-сокеты на сервере:

введите описание изображения здесь

Комментарии:

1. Привет, к сожалению, это сработало не так, как ожидалось. Мы переместили проект на другой сервер и обнаружили, что он работает как ожидалось, без изменений. Итак, что-то с исходным сервером вызывает сбой. На исходном сервере установлен протокол WebSocket, поэтому я не уверен, с чего начать поиск.

2. Я действительно ценю помощника. Спасибо, что нашли время и усилия, чтобы помочь с этим.