繁体   English   中英

尝试协商时SignalR 404错误

[英]SignalR 404 error when trying to negotiate

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

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 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 / signalsr / hubs ,它会显示动态生成的代理文件:

SignalR动态代理文件

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

SignaR日志

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

SignalR log 2

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

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

在此输入图像描述 在此输入图像描述

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM