2012-09-26 144 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