2012-09-26 9 views
15

Esto es más de dos preguntas, pero:¿Registro de excepción de SignalR?

  1. Cuál es la mejor manera de tener un gestor de excepciones de nivel superior para mi Hub? No parece posible con la versión actual de SignalR

  2. ¿Por qué esto no hace nada en el cliente cuando arrojo un error en mi Hub?

    $ .connection.hub.error (function() { alerta de devolución ("prueba"); });

Cuando elimino errores, puedo ver mi método de error está conectado, pero cuando lanzo una excepción en el Hub, puedo ver que nunca hay cualquier intento de llamar a la configuración de métodos I anterior. Lo único que sucede es que SignalR barra el error a la consola.

Para el registro, que puede cablear otros eventos bien

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

Respuesta

28

$.connection.hub.error se utiliza para manejar fallos en la conexión del cubo. Puede utilizar deferred.fail() de jQuery para manejar una excepción lanzada desde una invocación de concentrador particular ($.connection.hub.methodThatThrows().fail(function() { ... }), pero obviamente no maneja las excepciones lanzadas desde ninguna invocación a.

SignalR v1.0.0 agregará soporte para IHubPipelineModules. A continuación, podrá anular HubPipelineModule.BuildIncoming o HubPipelineModule.OnIncomingError que luego se pueden agregar al HubPipeline a través del GlobalHost.HubPipeline.AddModule(myHubPipelineModule).

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

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

Ejemplo aplicación:

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

respuesta interesante e informativo. Pensé que habría soporte para no tener que enganchar mi método de registro en el sitio de llamadas (y para cada devolución de llamada del concentrador). Algo feo, pero lo aguantaré siempre que sea la única forma. Muchas gracias por la información –

+0

No debería ser context.Hub.Clients.Caller.ExceptionHandler (ex.Message); – Raghav

+1

@RaghavKhunger tienes razón. Fijo. – halter73