2012-09-26 4 views
15

Dies ist mehr von zwei Fragen, aber:SignalR Ausnahmeprotokollierung?

  1. Was ist der beste Weg, um einen Top-Level-Exception-Handler für meinen Hub haben? Es scheint nicht möglich, mit der aktuellen Version von SignalR

  2. Warum tut dies eigentlich nichts auf dem Client, wenn ich einen Fehler in meinem Hub werfen?

    $ .connection.hub.error (function() { Rückmeldung ("test"); });

Wenn ich debuggen, kann ich meine Fehler Methode wird verdrahtet, sehen aber wenn ich eine Ausnahme auf dem Hub werfen, kann ich sehen, dass es nie einen Versuch, die Methode, die ich Setup oben zu nennen. Die einzige Sache, die passiert, ist SignalR barfs den Fehler zur Konsole.

Für das Protokoll, kann ich nur andere Veranstaltungen verdrahten feinen

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

Antwort

28

$.connection.hub.error verwendet Nabenverbindungsfehler zu behandeln. Sie können jQuerys deferred.fail() verwenden, um eine Ausnahme zu behandeln, die von einem bestimmten Hubaufruf ($.connection.hub.methodThatThrows().fail(function() { ... }) ausgelöst wurde, aber offensichtlich werden keine Ausnahmen behandelt, die aus dem Aufruf any ausgelöst werden.

SignalR v1.0.0 fügt Unterstützung für IHubPipelineModules hinzu. Dann können Sie HubPipelineModule.BuildIncoming oder HubPipelineModule.OnIncomingError überschreiben, die dann zu HubPipeline über GlobalHost.HubPipeline.AddModule(myHubPipelineModule) hinzugefügt werden können.

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

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

Beispielimplementierung:

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

Interessante und informative Antwort. Ich hätte gedacht, dass es Unterstützung geben würde, um meine Protokollierungsmethode nicht an der Call-Site (und für jeden Hub-Callback) einhängen zu müssen. Irgendwie hässlich, aber ich werde es ertragen, solange das der einzige Weg ist. Vielen Dank für die Information –

+0

Sollte es nicht context.Hub.Clients.Caller.ExceptionHandler (ex.Message); – Raghav

+1

@RaghavKhunger du hast Recht. Fest. – halter73