尝试协商时出现 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 以找出问题所在,这是一项耗时的工作。
所以我对 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 以找出问题所在,这是一项耗时的工作。