SignalR Negotiate 404

假装没事ソ 提交于 2019-12-05 15:43:07

问题


I am using SignalR 2.0. Everything works fine when running locally on my VS 2012. But when I publish the site on IIS, it breaks. The site loads but one of the scripts returns 404 Not Found. The script is something like.

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

This path doesn't exist indeed. The correct path should be:

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

Note the part in bold.

Inside the WebSite (https://example.com/) I have another Application (https://example.com/private/). This one is using SignalR.

This seems like a bug in SignalR since the signalr/hubs path is accessible from my private site.


回答1:


I had a similar problem. Here is the documentation for configuring the /signalr URL.

However, my solution differed from the docs. Instead of changing the standard app.MapSignalR(), I changed my client code to use /MyApp/signalr. Here is the code where "MyApp" is the virtual directory of my web application.

        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);
        });

I tried the other way around (change the MapSignalR to the /signalr path) but this did not work and the negotiation was still routed to /MyApp/signalr/negotiate.




回答2:


I had the same issue when web site with signalr is not running as root site. Below solution worked for me. instead of using /signalr, use ../signalr. it will work with any site name folder. no hardcoded name 'MyApp' var connection = $.hubConnection('../signalr', {useDefaultPath: false});




回答3:


Had the same issue. web sites running as virtual directories of the root site. For some reason prefixing with ../ as in ../signalr didn't work, but ./signalr did.

My sample code:

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:


Probably you added MapSignalR() in your Application (https://example.com/private/). If you want it on the root, then do the configuration on your WebSite (https://example.com/)



来源:https://stackoverflow.com/questions/19910943/signalr-negotiate-404

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!