2012-09-26 14 views
15

Questo è più di due domande, ma:Registrazione eccezioni SignalR?

  1. Qual è il modo migliore per avere un gestore di eccezioni di alto livello per il mio Hub? Non sembra possibile con l'attuale versione di SignalR

  2. Perché questo in realtà non fa nulla sul client quando lancio un errore nel mio hub?

    $ .connection.hub.error (function() { avviso di ritorno ("test"); });

Quando il debug, posso vedere il mio metodo di errore di essere cablato, ma quando ho un'eccezione sulla Hub, posso vedere non c'è mai alcun tentativo di richiamare il setup metodo che ho sopra. L'unica cosa che succede è SignalR che interrompe l'errore nella console.

Per la cronaca, posso cablare altri eventi bene

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

risposta

28

$.connection.hub.error viene utilizzato per gestire gli errori di collegamento del mozzo. È possibile utilizzare il comando deferred.fail() di jQuery per gestire un'eccezione generata da una particolare chiamata di hub ($.connection.hub.methodThatThrows().fail(function() { ... }), ma ovviamente non gestisce le eccezioni generate da invocazione a partire da .

SignalR v1.0.0 aggiungerà il supporto per IHubPipelineModules. Quindi sarà possibile eseguire l'override di HubPipelineModule.BuildIncoming o HubPipelineModule.OnIncomingError che può essere aggiunto allo HubPipeline tramite GlobalHost.HubPipeline.AddModule(myHubPipelineModule).

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

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

implementazione Esempio:

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

risposta interessante e informativo. Avrei pensato che ci sarebbe stato il supporto per non dover agganciare il mio metodo di registrazione al sito di chiamata (e per ogni callback dell'hub). Un po 'brutto, ma lo sopporto finché è l'unico modo. Grazie mille per l'informazione –

+0

Non dovrebbe essere context.Hub.Clients.Caller.ExceptionHandler (ex.Message); – Raghav

+1

@RaghavKhunger hai ragione. Fisso. – halter73