Je suis donc très nouveau sur SignalR, en fait je ne l'utilise que depuis quelques jours maintenant. Quoi qu'il en soit, je reçois l'erreur ci-dessous lors de la première mon application démarre:Erreur SignalR 404 lors de la tentative de négociation
Le code de l'application en question se trouve dans deux projets, une API Web et une application Page unique (SPA). Le premier a mon code backend (C#) et le second mon code côté client (AngularJS). Je pense que le problème pourrait être dû au fait que les projets en question fonctionnent sur différents ports. L'API Web, où vit ma moyeu de SignalR, est sur le port 60161 et le SPA est le 60813. Mon centre est déclaré comme ceci:
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();
}
}
puis dans mon dossier Startup.cs pour mon API Web j'initialiser SignalR comme ceci:
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);
}
mon code côté client J'utilise une API angulaire de signalR appelée-signalr moyeu angulaire (Angular-signalr-hub). Le côté client suit:
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'
});
J'ai fait quelques googler hier et l'une des suggestions que je suis tombé sur a été de mettre l'URL SignalR à celle de mon API Web, que je l'ai fait (ci-dessus la ligne commentée) . Quand je décommenter la ligne en question, qui ne semble faire quelque chose parce que si je passe maintenant à http://localhost:60161/signalr/hubs dans mon navigateur, il ne me montre le fichier proxy généré dynamiquement:
et quand je lance mon application Je n'ai plus l'erreur ci-dessus, mais maintenant il ne semble pas se connecter. Il arrive à la négociation en ligne et l'on s'y arrête:
je pense qu'il devrait ressembler à ceci (ce qui est d'un tutoriel SignalR j'ai trouvé):
En outre, aucun de mes auditeurs (déclaré dans mon code angulaire ci-dessus) n'est appelé, donc quelque chose fonctionne encore correctement. Il devrait y avoir plus de lignes dans le journal pour indiquer que la connexion a été établie avec succès, etc. Quel pourrait être le problème ici?
MISE À JOUR: lors de la poursuite de débogage j'ai découvert le problème est très probablement causé par la propriété ProtocolVersion étant différente entre le client et le résultat:
À cause de cela, il semble que ce existe juste et ne parvient pas à établir une connexion.
Une idée de ce qui pourrait causer le problème? – lukegf