2016-05-27 2 views
1

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

SignalR negotiate error

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:

SignalR dynamic proxy file

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:

SignaR log

je pense qu'il devrait ressembler à ceci (ce qui est d'un tutoriel SignalR j'ai trouvé):

SignalR log 2

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:

enter image description here enter image description here

À cause de cela, il semble que ce existe juste et ne parvient pas à établir une connexion.

+0

Une idée de ce qui pourrait causer le problème? – lukegf

Répondre

1

J'ai compris quel était le problème. Mes dépendances SignalR étaient obsolètes et à cause de cela, mes versions client et serveur étaient différentes. Tout ce que j'avais à faire était de mettre à jour (via NuGet Package Manager) toutes les dépendances de SignalR vers la dernière version et maintenant ça marche.

En remarque, SignalR n'était pas très bon pour me dire ce qui n'allait pas. En fait, aucun message d'erreur ne s'affichait, à moins bien sûr qu'il y ait un enregistrement supplémentaire quelque part qui devait être trouvé ou activé, en plus de la journalisation que j'avais déjà (activée).D'une manière ou d'une autre, il ne consigne pas certaines erreurs ou il est difficile de comprendre comment activer la journalisation. Je devais aller déboguer l'API de JQuery SignalR pour savoir quel était le problème, ce qui prenait beaucoup de temps.