2012-09-26 12 views
15

To jest mniej więcej dwa pytania, ale:Rejestrowanie wyjątków SignalR?

  1. Jaki jest najlepszy sposób, aby mieć górny poziom obsługi wyjątku dla mojego Hub? To nie wydaje się możliwe z aktualną wersją SignalR

  2. Dlaczego to właściwie nic nie robi na kliencie, gdy zgłaszam błąd w moim Hubie?

    $ .connection.hub.error (function() { alert zwrotny ("test"); });

Kiedy debugowania, widzę mój błąd metoda jest okablowany, ale gdy wyjątek na piaście, widzę, że nigdy nie jest jakaś próba wywołać konfigurację I Metoda powyżej. Jedyne, co się dzieje, to SignalR przekazuje błąd do konsoli.

Dla przypomnienia, mogę podłączyć się inne imprezy dobrze

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

Odpowiedz

28

$.connection.hub.error służy do obsługi awarii piasta. Możesz użyć funkcji deferred.fail() jQuery, aby obsłużyć wyjątek wyrzucony z konkretnej lokacji głównej ($.connection.hub.methodThatThrows().fail(function() { ... }), ale to oczywiście nie obsługuje wyjątków wyrzucanych z żadnych inwokacji.

SignalR v1.0.0 doda obsługę dla IHubPipelineModules. Wtedy będzie można zastąpić HubPipelineModule.BuildIncoming lub HubPipelineModule.OnIncomingError, które następnie można dodać do HubPipeline przez GlobalHost.HubPipeline.AddModule(myHubPipelineModule).

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

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

Przykład wdrożenia:

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

Ciekawe i pouczające odpowiedź. Pomyślałbym, że będzie wsparcie, że nie będę musiał przechwytywać mojej metody logowania na stronie wywołania (i dla każdego wywołania zwrotnego centrum). Trochę brzydki, ale wytrzymam, dopóki to jedyny sposób. Wielkie dzięki za informacje –

+0

Nie powinno to być context.Hub.Clients.Caller.ExceptionHandler (ex.Message); – Raghav

+1

@RaghavKhunger masz rację. Naprawiony. – halter73