Comment gérer l'exception du serveur SignalR au client?

Le gestionnaire d'erreur est ajouté comme ceci au client:

$.connection.hub.url = "/signalr"; $.connection.hub.logging = true; $.connection.hub.error(function(error) { console.log('SignalrAdapter: ' + error); }); $.connection.hub.start().done(function() { me.onStartDone(); }); // ... 

Au serveur, il est:

 hubConfiguration.EnableDetailedErrors = true; 

En conséquence, les documents devraient être suffisants.

À l'exception de je l'ai lancé, il suffit d'afficher un texte de journal pour celui-ci et n'invoque pas le gestionnaire:

 [18:18:19 GMT+0000()] SignalR: ... [[[my error description here]]] ... 

Dans ma page cshtml:

 <script src="~/Scripts/vendor/jquery.signalR-2.1.2.js"></script> <script src="~/signalr/hubs"></script> 

Cependant, si j'attache un gestionnaire d'erreur à la méthode elle-même, on l'appelle:

 $.connection.operatorHub.server.myMethodName(someParam).fail(function(error) { console.log("Error handler called: " + error); }); 

Comment gérer une erreur générale?

METTRE À JOUR. La réponse ci-dessous est la suivante. Voir aussi:

  • Http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#handleErrors
  • SignalR, Owin et la gestion des exceptions

J'espère que ça aide quelqu'un.

J'ai testé sur un petit projet de discussion (téléchargé ici). Il semble que cette méthode ne gère que les erreurs de connexion.

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

J'ai pu gérer toutes les exceptions avec la classe HubPipelineModule .

1) J'ai créé un SOHubPipelineModule

 public class SOHubPipelineModule : HubPipelineModule { protected override void OnIncomingError(ExceptionContext exceptionContext, IHubIncomingInvokerContext invokerContext) { dynamic caller = invokerContext.Hub.Clients.Caller; caller.ExceptionHandler(exceptionContext.Error.Message); } } 

2) J'ai ajouté le module à GlobalHost.HubPipeline

  // Any connection or hub wire up and configuration should go here GlobalHost.HubPipeline.AddModule(new SOHubPipelineModule()); var hubConfiguration = new HubConfiguration { EnableDetailedErrors = true }; app.MapSignalR(hubConfiguration); 

3) Ma classe ChatHub :

  public class ChatHub : Hub { public void Send(string name, string message) { throw new Exception("exception for Artyom"); Clients.All.broadcastMessage(name, message); } } 

4) Dans les js, j'utilise ce code pour obtenir mon message d'exception:

 $.connection.chatHub.client.exceptionHandler = function (error) { console.log('SignalrAdapter: ' + error); alert('SignalrAdapter: ' + error); }; 

Entrez la description de l'image ici

J'ai utilisé la gestion des erreurs sur le client comme ceci:

C'est pour SignalR version 2

Plus de détails: documentation SignalR – Comment gérer les erreurs dans la classe Hub

Hub – AppHub.cs:

 public class AppHub : Hub { public void Send(string message) { throw new HubException("Unauthorized", new { status = "401" }); } } 

Côté client:

 $(function () { var appHub = $.connection.appHub; $.connection.hub.start().done(function () { appHub.server.send("test message") .fail(function (e) { if (e.source === 'HubException') { console.error("Error message: ", e.message); console.error("Error status: ", e.data.status); } }); }); });