2012-09-26 152 views
15

这更多的是两个问题,但:SignalR异常日志记录?

  1. 什么是对我的枢纽顶层异常处理的最佳方式?当前版本的SignalR似乎不可能使用当前版本的SignalR

  2. 为什么当我在我的集​​线器中发生错误时,这实际上不会在客户端上做任何事情? (函数(){ return alert(“test”); });}};

当我调试,我可以看到被有线了我的错误方法,但是当我扔在集线器一个例外,我可以看到从未有任何试图拨打上面的方法我设置。唯一发生的事情是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"); 
}); 

回答

28

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

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

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

有趣和翔实的答案。我原以为会有支持,不必在呼叫站点挂钩我的日志记录方法(以及每个集线器回调)。有点丑,但只要这是唯一的方法,我会忍受它。非常感谢信息 –

+0

不应该是context.Hub.Client.Caller.ExceptionHandler(ex.Message); – Raghav

+1

@RaghavKhunger你是对的。固定。 – halter73