web-dev-qa-db-fra.com

SignalR: une erreur s'est produite lors de l'appel de la méthode Hub "XXX"

Serveur:

public void AddLine(string line)
{
    Clients.Others.addLine(line);
}

Client .NET:

await rtHubProxy.Invoke("AddLine", "lineInfo");

Exception:

InvalidOperationException: There was an error invoking Hub method 'xxx.AddLine'.

En fait, j'essayais d'invoquer la méthode avec un objet complexe, seulement pour trouver l'exception. Par conséquent, j'ai changé le type du paramètre et laissé le corps AddLine () vide à des fins de débogage, ce qui, étrangement, a toujours provoqué la même exception.

J'ai également une autre invocation SignalR du côté client, juste plusieurs lignes ci-dessus, qui s'exécute de manière réactive sans erreur. Le code côté serveur correspondant comme suit:

public void Hello(string text)
{
    Clients.All.hello(text);
}

Quelqu'un pourrait-il savoir où je me suis trompé? J'ai débogué pendant plus de 4 heures et je ne trouve toujours pas l'annulation même après avoir simplifié le code.

(Orthographe strictement vérifiée, pas de décalage.)

27
Isilmë O.

De toute évidence, vous avez des problèmes côté serveur. Mais pour savoir quel est le problème, vous devez voir une erreur détaillée. Pour des raisons de sécurité, SignalR ne vous donne pas d'erreur détaillée par défaut. Mais vous pouvez modifier votre code pour obtenir l'erreur détaillée.

Vous devez d'abord ajouter ce code au Startup.cs:

var hubConfiguration = new HubConfiguration();
    hubConfiguration.EnableDetailedErrors = true;
    app.MapSignalR(hubConfiguration);

Ensuite, pour afficher l'erreur côté client, vous devez ajouter ce code à votre projet:

$.connection.hub.error(function (error) {
    console.log('SignalR error: ' + error)
});

Aussi simple que cela et vous êtes prêt à partir.

Parfois, vous n'obtenez même pas la partie client pour voir l'erreur. Mais en faisant la première partie, vous activerez l'erreur détaillée et vous pourrez voir les erreurs sur la réponse SignalR. Vous avez juste besoin d'un outil comme Chrome Browser Web Developer Tool qui vous donne la partie réseau de l'opération où tous les états de transfert de données sont enregistrés. Vous pouvez y vérifier les erreurs SignalR. Les informations sur le le journal sera très détaillé et utile.

Ceci est un exemple de débogage avec Chrome Browser pour les personnes qui voient les erreurs SignalR via Chrome outil de débogage:

Télécharger la taille de l'image complète

This is for people who want to debug the ajax response through Chrome Browser

Faites-moi savoir si vous avez d'autres problèmes à ce sujet.

Pour plus d'informations, consultez: Erreurs SignalR

62
Hirad Nikoo

OK, après 2 heures et demie de débogage rocheux, j'ai finalement découvert la vérité, réalisant que de manière bizarre, cependant j'ai changé mon code côté serveur, le mécanisme d'infiltration ou les fonctionnalités n'ont pas été synchronisés jusqu'à ce que je reconstruise accidentellement le projet et attende la IIS Express pour se réchauffer à nouveau.

Ce n'est pas la faute de SignalR, mais je pense de Visual Studio. Chaque fois que j'apporte des modifications à la classe Hub, je dois reconstruire le projet côté serveur. C'est ça. Je dois dire que ça fait vraiment mal, même si je ne sais pas pourquoi cela devrait se produire - Peut-être que c'est parce que ma solution se compose de projets WinRT et ASP.NET qui ne s'entendent pas bien? Je ne sais pas.

Pour info, je vais attacher un lien à un post, dans lequel un problème de "reconstruction" similaire est arrivé à quelqu'un d'autre.

http://forum.kooboo.com/yaf_postst2250_How-to-use-SignalR-in-a-Module.aspx

Et la solution de contournement pour l'instant est plus que simple - il suffit d'aller RECONSTRUIRE.

2
Isilmë O.