c# - 尝试协商时出现 SignalR 404 错误

标签 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

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

最佳答案

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

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

关于c# - 尝试协商时出现 SignalR 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37486799/

相关文章:

asp.net - ASP.NET MVC 5中的ErrorHanldeAttribute或OnException方法未处理异常

angularjs - 使用同一对象的并行 $http 调用

javascript - 无法读取未定义的属性 'controller'

asp.net - 在 asp.net UserControl 上公开嵌套的 HTML 属性

c# - "C# base class virtual function"- "override in Managed C++ ref class"

C# 将组合框的内容写入注册表的最佳方法是什么?

C# 窗体 : move text from one textbox to another

ASP.Net - 当前跟踪状态和 session 变量的最佳实践是什么?

javascript - 如何将对 XMLHttpRequest 的调用封装在 $q promise 中?

c# - 动态改变 splitContainer 面板的大小