尝试协商时出现 SignalR 404 错误

SignalR 404 error when trying to negotiate

所以我对 SignalR 还很陌生,事实上我现在才使用它几天。不管怎样,当我的应用程序第一次启动时,我收到以下错误:

相关应用程序的代码位于两个项目中,Web API 和单页应用程序 (SPA)。第一个是我的后端代码 (C#),第二个是我的客户端代码 (AngularJS)。我认为问题可能是由于有问题的项目 运行 在不同的端口上。我的 SignalR 集线器所在的 Web API 位于端口 60161 上,SPA 位于 60813 上。我的集线器声明如下:

public class ReportHub : Hub
{
    public void SendReportProgress(IList<ReportProgress> reportProgress)
    {                
        this.Clients.All.broadcastReportProgress(reportProgress);
    }

    public override Task OnConnected()
    {
        this.Clients.All.newConnection();

        return base.OnConnected();
    }
}

然后在我的 Web Startup.cs 文件中 API 我这样初始化 SignalR:

public void Configuration(IAppBuilder app)
{           
    HttpConfiguration config = new HttpConfiguration();
    config.Services.Replace(typeof(IHttpControllerActivator), new NinjectFactory());
    config.MessageHandlers.Add(new MessageHandler());

    //set up OAuth and Cors
    this.ConfigureOAuth(app);
    config.EnableCors();
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

    // Setting up SignalR
    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        map.RunSignalR(new HubConfiguration { EnableJSONP = true });
    });

    //set up json formatters
    FormatterConfig.RegisterFormatters(config.Formatters);

    WebApiConfig.Register(config);

    app.UseWebApi(config);
}

对于我的客户端代码,我使用名为 angular-signalr-hub (Angular-signalr-hub) 的 Angular SignalR API。客户端如下:

angular
.module("mainApp")
.factory("reportHubService", ["$rootScope", "Hub", reportHubService]);

/// The factory function
function reportHubService($rootScope, Hub) {
    var vm = this;
    vm.reportName = "None";

    // Setting up the SignalR hub
    var hub = new Hub("reportHub", {
        listeners: {
            'newConnection': function(id) {
                vm.reportName = "SignalR connected!";
                $rootScope.$apply();
            },
            'broadcastReportProgress': function (reportProgress) {
                vm.reportName = reportProgress.reportName;
                $rootScope.$apply();
            }
        },
        errorHandler: function(error) {

        },
        hubDisconnected: function () {
            if (hub.connection.lastError) {
                hub.connection.start();
            }
        },
        transport: 'webSockets',
        logging: true
        //rootPath: 'http://localhost:60161/signalr'
    });

我昨天做了一些谷歌搜索,我想到的一个建议是将 SignalR URL 设置为我的 Web API 之一,我这样做了(上面注释掉的行) .当我取消注释相关行时,这似乎确实有所作为,因为如果我现在在浏览器中转到 http://localhost:60161/signalr/hubs,它会向我显示动态生成的代理文件:

当我 运行 我的应用程序时,我不再收到上述错误,但现在它似乎无法连接。它到达谈判线并停在那里:

我认为它应该是这样的(这是我找到的一个 SignalR 教程):

此外,我的 none 个听众(在我上面的 Angular 代码中声明)被调用,所以现在仍然可以正常工作。日志中应该有更多行表示连接已成功建立等。这里可能是什么问题?

更新:经过进一步调试,我发现问题很可能是由于协议版本 属性 在客户端和这里的结果之间不同造成的:

因此它似乎只是存在并且无法建立连接。

我明白问题出在哪里了。我的 SignalR 依赖项已过时,因此我的客户端和服务器版本不同。我所要做的就是将所有 SignalR 依赖项更新(通过 NuGet 包管理器)到最新版本,现在它可以工作了。

附带说明一下,SignalR 不太擅长告诉我哪里出了问题。事实上,没有显示任何错误消息,除非除了我已经拥有(打开)的日志记录之外,当然还有一些必须在某处找到或打开的额外日志记录。无论哪种方式,它要么不记录某些错误,要么很难弄清楚如何打开所有日志记录。我不得不去调试 JQuery SignalR api 以找出问题所在,这是一项耗时的工作。