Artyom Artyom - 9 months ago 73
Javascript Question

How to handle SignalR server exception at client?

The error handler is added like this at 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(); });
// ...

At server it is:

hubConfiguration.EnableDetailedErrors = true;

Accordingly to the docs this should be enough.

At my exception throwing it just displays a log text for it and does not invoke the handler:

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

At my cshtml page:

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

However if I attach an error handler to the method itself it is got called:

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

How to handle a general error?

The answer is below. Also see these:

Hope it helps someone.


I tested on a little chat project (downloaded here) it seems this method handle only connection errors.

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

I was able to handle all exceptions with the HubPipelineModule class.

1) I created a SOHubPipelineModule

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

2) I Added the module to GlobalHost.HubPipeline

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

3) My ChatHub class :

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


4) In the js I use this code to get my exception message :

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

enter image description here