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?

UPDATE.
The answer is below. Also see these:

Hope it helps someone.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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;
        caller.ExceptionHandler(exceptionContext.Error.Message);
    }
}

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 };
  app.MapSignalR(hubConfiguration);

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

Method 2

I’ve used the error handling on the client like this:

It’s for SignalR version 2

More detail: SignalR documentation – How to handle errors in the Hub class

Hub – AppHub.cs:

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

Client-side:

$(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);
                        }

                    });
            });

        });


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x