所以我对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属性不同造成的:
因为它似乎只是存在并且无法建立连接。
答案 0 :(得分:3)
我弄清楚问题是什么。我的SignalR依赖项已过时,因此我的客户端和服务器版本不同。我所要做的就是将所有SignalR依赖项更新(通过NuGet Package Manager)到最新版本,现在它可以正常工作。
作为旁注,SignalR并不是很擅长告诉我出了什么问题。事实上,没有显示任何错误消息,除非我已经拥有(打开)日志记录,除非当然还有一些必须找到或打开的额外日志记录。无论哪种方式,它要么不记录某些错误,要么很难弄清楚如何打开所有日志记录。我不得不去调试JQuery SignalR api以找出问题所在,这是一项耗时的工作。