Центр SignalR не найден после публикации веб-сайта

У меня есть веб-приложение ASP.Net Core 3.1, которое включает в себя Razor Pages, контроллеры Api и концентратор SignalR. Мой Startup.cs выглядит так:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddRazorPages();
    services.AddSignalR(options =>
    {
        options.EnableDetailedErrors = true;
    });
    services.AddMvc();
    services.AddSingleton<HubManager>();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseDeveloperExceptionPage();
    app.UseAuthentication();
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapControllers();
        endpoints.MapHub<MainHub>("/MainHub");
    });
}

На моей странице с бритвой я добавляю следующее в конце скрипта:

<script src="~/js/signalr//dist//browser/signalr.js"></script>
<script src="~/js/HubManager.js"></script>

И HubManager.js выглядит так:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/MainHub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .configureLogging(signalR.LogLevel.Information)
    .withAutomaticReconnect()
    .build();

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

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

start();

Затем я публикую веб-приложение и перехожу на страницу, которая использует SignalR (используя Chrome). Но когда я проверяю консоль, я вижу, что SignalR опрашивает каждые 1 с, и эта ошибка продолжает отображаться:

signalr.js: 4709 Соединение WebSocket с 'wss: // myurl / MainHub' не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

HubManager.js: 61 Ошибка: произошла ошибка транспорта. в WebSocket.webSocket.onerror (signalr.js: 4728)

  • https: // myurl / MyWebApp / Главная / MyPage
  • https: //myurl/MyWebApp/js/signalr/dist/browser/signalr.js
  • wss: // myurl / MainHub

На сервере установлен протокол Websockets. Так в чем же может быть проблема?


person Ivan-Mark Debono    schedule 22.06.2020    source источник
comment
Я хотел бы подтвердить эту информацию с вами: 1) Может ли маршрутизация для razor и api-части работать на сервере? 2) Если не ограничить клиента использовать только WebSockets транспорты, это работает? 3) есть ли в журналах сервера полезная информация?   -  person Fei Han    schedule 23.06.2020
comment
@FeiHan 1) маршрутизация для работы api, для бритвы все еще неизвестна, поскольку я все еще создаю приложение 2) клиент ограничен веб-сокетами, как показано выше 3) журналы сервера iis или сигнализатор?   -  person Ivan-Mark Debono    schedule 23.06.2020


Ответы (1)


Соединение WebSocket с 'wss: // myurl / MainHub' не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

Я могу воспроизвести ту же проблему, если я размещу приложение ASP.NET Core как приложение IIS MyWebApp, но не установлю URL-адрес с базой путей вложенного приложения на стороне клиента SignalR JavaScript.

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

Чтобы заставить его работать с субприложением IIS, вы можете попробовать изменить код, как показано ниже, а затем повторно опубликовать его на своем сервере IIS.

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/MyWebApp/MainHub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .configureLogging(signalR.LogLevel.Information)
    .withAutomaticReconnect()
    .build();
person Fei Han    schedule 24.06.2020
comment
Я получаю эту ошибку сейчас: соединение WebSocket с 'wss: // myUrl / MyWebApp / MainHub? Id = rjBcaMyToBn0GsQ6j2ZXQA' не выполнено: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 200 - person Ivan-Mark Debono; 24.06.2020
comment
Вы можете попробовать настроить его с помощью других транспортов (например, LongPolling) и проверить, может ли он работать. - person Fei Han; 25.06.2020