[英]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 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教程):
另外,没有一个我的听众(在我上面的Angular代码中声明)被调用,所以现在仍然有些工作正常。 日志中应该有更多行,以便成功建立连接,等等。这可能是什么问题?
更新:进一步调试后我发现问题很可能是由于ClientVersion属性在客户端和结果之间的不同造成的:
因为它似乎只是存在并且无法建立连接。
我弄清楚问题是什么。 我的SignalR依赖项已过时,因此我的客户端和服务器版本不同。 我所要做的就是将所有SignalR依赖项更新(通过NuGet Package Manager)到最新版本,现在它可以工作了。
作为旁注,SignalR并不是很擅长告诉我出了什么问题。 事实上,没有显示任何错误消息,除非我已经拥有(打开)日志记录,除非当然还有一些必须找到或打开的额外日志记录。 无论哪种方式,它要么不记录某些错误,要么很难弄清楚如何打开所有日志记录。 我不得不去调试JQuery SignalR api以找出问题所在,这是一项耗时的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.