Javascript 信号异常记录?

Javascript 信号异常记录?,javascript,signalr,signalr-hub,Javascript,Signalr,Signalr Hub,这更多的是两个问题,但是: 为我的中心提供顶级异常处理程序的最佳方式是什么?对于当前版本的SignalR,这似乎是不可能的 当我在集线器中抛出一个错误时,为什么这实际上对客户端没有任何作用 $.connection.hub.error(函数(){ 返回警报(“测试”); }); 当我调试时,我可以看到我的错误方法被连接起来,但是当我在集线器上抛出异常时,我可以看到从来没有人试图调用我上面设置的方法。唯一发生的事情是信号器将错误发送到控制台 作为记录,我可以很好地连接其他事件 //Called d

这更多的是两个问题,但是:

  • 为我的中心提供顶级异常处理程序的最佳方式是什么?对于当前版本的SignalR,这似乎是不可能的

  • 当我在集线器中抛出一个错误时,为什么这实际上对客户端没有任何作用

    $.connection.hub.error(函数(){ 返回警报(“测试”); });

  • 当我调试时,我可以看到我的错误方法被连接起来,但是当我在集线器上抛出异常时,我可以看到从来没有人试图调用我上面设置的方法。唯一发生的事情是信号器将错误发送到控制台

    作为记录,我可以很好地连接其他事件

    //Called during exceptions just fine 
    $.connection.hub.received(function() {
      return alert("Received Data");
    });
    
    //Seems to do nothing?
    $.connection.hub.error(function() {
      return alert("Received Exception");
    });
    

    $.connection.hub.error
    用于处理集线器连接故障。您可以使用jQuery的deferred.fail()处理从特定集线器调用引发的异常(
    $.connection.hub.methodThatThrows().fail(function(){…}
    ),但这显然不会处理从任何调用引发的异常

    SignalR v1.0.0将添加对
    iHubPipelineModule
    的支持。然后您将能够覆盖
    HubPipelineModule.BuildIncoming
    HubPipelineModule.OnInIncomingError
    ,然后可以通过
    GlobalHost.HubPipeline.AddModule(myHubPipelineModule)
    将其添加到
    HubPipeline

    实施示例:

    using Microsoft.AspNet.SignalR.Hubs;
    
    public class MyHubPipelineModule : HubPipelineModule
    {
        protected override void OnIncomingError(ExceptionContext exceptionContext,
                                                IHubIncomingInvokerContext invokerContext)
        {
            dynamic caller = invokerContext.Hub.Clients.Caller;
            caller.ExceptionHandler(exceptionContext.Error.Message);
        }
    }
    
    protected void Application_Start()
    {
        GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
    }
    
    // JS
    // hub.client is also introduced in SignalR v1.0.0
    $.connection.myHub.client.exceptionHandler = function (message) {
        alert(message);
    };
    

    有趣且信息丰富的答案。我原以为会有人支持不必在调用站点(以及每个集线器回调)挂接我的日志记录方法。有点难看,但只要这是唯一的方法,我会忍受的。非常感谢提供的信息。应该是context.hub.Clients.Caller.ExceptionHandler(例如Message);非常有用,谢谢。另一个需要添加的内容是,对于SignalR的v2,OnInMingError的方法签名已更改为OnInMingError(ExceptionContext,iHubingInvokerContext)。如何在OWIN主机中注册HubPipelineModule?@a您可以在OWIN启动类中使用
    GlobalHost.HubPipeline.AddModule