SignalR Negotiate 404

Я использую SignalR 2.0. Все работает нормально при запуске локально на моем VS 2012. Но когда я публикую сайт в IIS, он ломается. Сайт загружается, но один из скриптов возвращает 404 Not Found. script что-то вроде.

https://example.com/signalr/negotiate?xxx

Этот путь не существует. Правильный путь должен быть:

https://example.com /private/signalr/negotiate? xxx

Обратите внимание на часть, выделенную полужирным шрифтом.

Внутри WebSite (https://example.com/) У меня есть другое приложение (https://example.com/private/). Этот использует SignalR.

Это похоже на ошибку в SignalR, поскольку путь signalr/hubs доступен с моего личного сайта.

Ответ 1

У меня была аналогичная проблема. Вот документация для настройки /signalr URL.

Однако мое решение отличалось от документов. Вместо изменения стандарта app.MapSignalR() я изменил код клиента, чтобы использовать /MyApp/signalr. Вот код, где "MyApp" является виртуальным каталогом моего веб-приложения.

        var connection = $.hubConnection('/MyApp/signalr', {useDefaultPath: false});
        var changesHub = connection.createHubProxy('changesHub');

        changesHub.on('userCountChanged', function (count) {
            $('#user-count').text(count);
        });

        connection.start().done(function () {
            console.log('Hub has started');
            changesHub.invoke('subscribeToChanges', user.id);
        });

Я пробовал наоборот (изменил MapSignalR на путь /signalr ), но это не сработало, и согласование все еще маршрутизировалось в/MyApp/signalr/negotiate.

Ответ 2

У меня была такая же проблема, когда веб-сайт с signalr не запускался как корневой сайт. Ниже решение работало для меня. вместо /signalr используйте ../signalr. он будет работать с любой папкой с именем сайта. нет жесткокодированного имени 'MyApp' var connection = $.hubConnection('../signalr', {useDefaultPath: false});

Ответ 3

Была та же проблема. веб-сайты, работающие как виртуальные каталоги корневого сайта. По какой-то причине префикс с../как в.. /signalr не работал, но. /signalr.

Мой пример кода:

function initSR() {
    // logs signalr messages
    $.connection.hub.logging = true;

    // Declare a proxy to reference the hub.             
    var chat = $.connection.myHub;
    $.connection.hub.url = "./signalr";
    $.connection.hub.start();
    // Create a function that the hub can call to broadcast messages.
    chat.client.broadcastMessage = function (message) {
        // Process Message, take action upon receipt
        alert(message);
    };
}

Ответ 4

Возможно, вы добавили MapSignalR() в свое приложение (https://example.com/private/). Если вы хотите его в корне, то сделайте конфигурацию на своем веб-сайте (https://example.com/)

Ответ 5

Ваша проблема в коде сервера. Просто поместите app.UseSignalR(), прежде чем app.UseSpaStaticFiles() в Startup.cs файле