SignalR异常记录?

时间:2012-09-26 19:19:39

标签: javascript signalr signalr-hub

这是两个问题,但是:

  1. 为我的Hub设置顶级异常处理程序的最佳方法是什么?目前版本的SignalR

  2. 似乎无法实现
  3. 为什么当我在Hub中抛出错误时,这实际上在客户端上没有做任何事情?

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

  4. 当我调试时,我可以看到我的错误方法被连线,但是当我在Hub上抛出异常时,我可以看到从来没有尝试调用我在上面设置的方法。唯一发生的事情是SignalR将错误发送到控制台。

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

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

1 个答案:

答案 0 :(得分:31)

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

SignalR v1.0.0将添加对IHubPipelineModules的支持。然后,您可以覆盖HubPipelineModule.BuildIncomingHubPipelineModule.OnIncomingError,然后可以通过HubPipeline将其添加到GlobalHost.HubPipeline.AddModule(myHubPipelineModule)

https://github.com/SignalR/SignalR/issues/548

https://github.com/SignalR/SignalR/commit/83fdbfd9baa1f1cc3399d7f210cb062597c8084c

示例实施:

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