尝试协商时SignalR 404错误

时间:2016-05-27 15:06:42

标签: c# asp.net angularjs signalr signalr-hub

所以我对SignalR很新,事实上我现在只用了几天了。无论如何,当我的应用程序首次启动时,我收到以下错误:

SignalR negotiate error

有问题的应用程序的代码位于两个项目中,即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 API的Startup.cs文件中,我将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 dynamic proxy file

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

SignaR log

我认为它应该是这样的(这是我发现的SignalR教程):

SignalR log 2

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

更新:进一步调试后我发现问题很可能是由于客户端和结果之间的ProtocolVersion属性不同造成的:

enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:3)

我弄清楚问题是什么。我的SignalR依赖项已过时,因此我的客户端和服务器版本不同。我所要做的就是将所有SignalR依赖项更新(通过NuGet Package Manager)到最新版本,现在它可以正常工作。

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