所以我对 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/signalr/hubs在我的浏览器中,它确实显示了动态生成的代理文件:
当我运行我的应用程序时,我不再收到上述错误,但现在它似乎没有连接。它到达谈判线并停在那里:
我认为它应该是这样的(这是我找到的一个 SignalR 教程):
此外,我的监听器(在我上面的 Angular 代码中声明的)都没有被调用,所以现在仍然可以正常工作。日志中应该有更多行表明连接已成功建立等。这里可能是什么问题?
更新:经过进一步调试,我发现问题很可能是由于客户端的 ProtocolVersion 属性与此处的结果不同引起的:
因此它似乎只是存在并且无法建立连接。
最佳答案
我想出了问题所在。我的 SignalR 依赖项已过时,因此我的客户端和服务器版本不同。我所要做的就是将所有 SignalR 依赖项更新(通过 NuGet 包管理器)到最新版本,现在它可以工作了。
附带说明一下,SignalR 不太擅长告诉我哪里出了问题。事实上,没有显示任何错误消息,除非除了我已经拥有(打开)的日志记录之外,当然还有一些必须在某处找到或打开的额外日志记录。无论哪种方式,它要么不记录某些错误,要么很难弄清楚如何打开所有日志记录。我不得不去调试 JQuery SignalR api 以找出问题所在,这是一项耗时的工作。
关于c# - 尝试协商时出现 SignalR 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37486799/