2012-11-27 14 views
14

Ich benutze SignalR Hub in meiner MVC4-Anwendung. Ich habe ELMAH hinzugefügt, um alle Fehler zu behandeln. Das Problem ist, dass Fehler, die im Hub auftreten, nicht in ELMAH axd protokolliert werden. Gibt es eine Möglichkeit, es zu konfigurieren?So konfigurieren Sie ELMAH mit SignalR

Antwort

9

Sie müssen eine HubPipelineModule hinzufügen und sicherstellen, dass Sie einen ApplicationName in Ihrem errorLog-Element festlegen. Sonst kann Elmah keinen Fehler protokollieren, da es keinen HttpContext oder einen AppName zum Anmelden hat .

<errorLog type="Elmah.SqlErrorLog, Elmah" applicationName="MyAppName" connectionStringName="myConnString" /> 

Die HubPipelineModule code I've used ist wie folgt:

public class ElmahPipelineModule : HubPipelineModule 
{ 
    private static bool RaiseErrorSignal(Exception e) 
    { 
     var context = HttpContext.Current; 
     if (context == null) 
      return false; 
     var signal = ErrorSignal.FromContext(context); 
     if (signal == null) 
      return false; 
     signal.Raise(e, context); 
     return true; 
    } 

    private static void LogException(Exception e, IHubIncomingInvokerContext invokerContext) 
    { 
     var context = HttpContext.Current; 
     ErrorLog el = ErrorLog.GetDefault(context); 
     el.Log(new Error(e)); 
    } 

    protected override void OnIncomingError(Exception ex, IHubIncomingInvokerContext context) 
    { 
     var exception = ex; 
     if (ex is TargetInvocationException) 
     { 
      exception = ex.InnerException; 
     } 
     else if (ex is AggregateException) 
     { 
      exception = ex.InnerException; 
     } 

     if (!RaiseErrorSignal(exception)) 
      LogException(exception, context); 
    } 
} 

Achten Sie darauf, das Modul an den Hub-Pipeline hinzufügen:

GlobalHost.HubPipeline.AddModule(new ElmahPipelineModule()); 

EDIT

SignalR 2+

Ich bemerkte, dass keine meiner SignalR-Ausnahmen in einem aktuellen Projekt, an dem ich gearbeitet habe, protokolliert wurden, und dass eine ArgumentNullException ausgelöst wird, wenn das ErrorSignal vom aktuellen Kontext abgerufen werden soll. Die folgende Methode behandelt diese Ausnahme ordnungsgemäß, sodass SignalR-Fehler erneut protokolliert werden.

+1

Für alle anderen, die im letzten Schritt hängen bleiben, fügen Sie die letzte Zeile in die RegisterHubs-Klasse ein. Zum Beispiel: 'public static void Start() {RouteTable.Routes.MapHubs(); GlobalHost.HubPipeline.AddModule (new Shopperscape.Web.API.ElmahPipelineModule()); } ' – Chris

+0

@Chris Funktioniert das für SignalR 1.x? –

+1

@Giles - dieser Code ist für SignalR 1 – damienc88

Verwandte Themen