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:
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); };
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); } }); }); });