How to handle SignalR server exception at client?

前端 未结 2 1049
忘了有多久
忘了有多久 2020-12-30 12:59

The error handler is added like this at client:

$.connection.hub.url = \"/signalr\";
$.connection.hub.logging = true;
$.connection.hub.error(function(error)          


        
相关标签:
2条回答
  • 2020-12-30 13:10

    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);
                            }
    
                        });
                });
    
            });
    
    0 讨论(0)
  • 2020-12-30 13:37

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

    0 讨论(0)
提交回复
热议问题