2016-01-29 18 views
6

Ich bin ein wenig verwirrt über die Verwendung von Elmah in den ASP.NET 5/MVC 6-Projekten. Ich habe das Paket von nugget und es hinzugefügt "Elmah.Mvc": "2.1.2" zu Abhängigkeiten in project.json.Wie benutzt man Elmah in ASP.NET 5/vNext/Core?

Ich bin mir nicht sicher, wohin ich von hier gehen soll - damals würde nuget Einträge in der web.config hinzufügen, die jetzt weg ist. Und ich kann keine Beispiele auf ihrem GitHub oder anderswo finden.

Fehle ich etwas einfaches?

+0

Nicht alle Pakete wurden aktualisiert, um mit ASP.NET Core kompatibel zu sein. Angesichts der erforderlichen Integration zwischen Elmah und dem ASP.NET-Stack würde ich sagen, dass Elmah noch nicht aktualisiert wurde. – mason

+0

Mögliches Duplikat von [ELMAH auf ASP.NET vNext?] (Http://stackoverflow.com/questions/28907017/elmah-on-asp-net-vnext) – blowdart

Antwort

10

Anstatt ELMAH zu verwenden, ist es nicht schwer, die Fehlerprotokollierung manuell zu implementieren. Dieser Prozess fängt alle im Projekt auftretenden Ausnahmen ab und protokolliert sie in einer Datenbanktabelle. Dazu fügen Sie den folgenden auf die Configure-Methode in Startup.cs

if (env.IsDevelopment()) 
    { 
    app.UseDeveloperExceptionPage(); 
    app.UseBrowserLink(); 
    } 
    else 
    { 
    app.UseExceptionHandler(builder => 
     { 
     builder.Run(async context => 
     { 
      context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; 
      context.Response.ContentType = "text/html"; 

      var error = context.Features.Get<Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature>(); 
      if (error != null) 
      { 
      LogException(error.Error, context); 
      await context.Response.WriteAsync("<h2>An error has occured in the website.</h2>").ConfigureAwait(false); 
      } 
     }); 
     }); 
    } 

Fügen Sie diese in Startup.cs auch:

private void LogException(Exception error, HttpContext context) 
{ 
    try 
    { 
    var connectionStr = Configuration["ConnectionString"]; 
    using (var connection = new System.Data.SqlClient.SqlConnection(connectionStr)) 
    { 
     var command = connection.CreateCommand(); 
     command.CommandText = @"INSERT INTO ErrorLog (Application, Host, Type, Source, Path, Method, Message, StackTrace, [User], WhenOccured) 
    VALUES (@Application, @Host, @Type, @Source, @Path, @Method, @Message, @StackTrace, @User, @WhenOccured)"; 
     connection.Open(); 

     if (error.InnerException != null) 
     error = error.InnerException; 

     command.Parameters.AddWithValue("@Application", this.GetType().Namespace); 
     command.Parameters.AddWithValue("@Host", Environment.MachineName); 
     command.Parameters.AddWithValue("@Type", error.GetType().FullName); 
     command.Parameters.AddWithValue("@Source", error.Source); 
     command.Parameters.AddWithValue("@Path", context.Request.Path.Value); 
     command.Parameters.AddWithValue("@Method", context.Request.Method); 
     command.Parameters.AddWithValue("@Message", error.Message); 
     command.Parameters.AddWithValue("@StackTrace", error.StackTrace); 
     var user = context.User.Identity?.Name; 
     if (user == null) 
     command.Parameters.AddWithValue("@User", DBNull.Value); 
     else 
     command.Parameters.AddWithValue("@User", user); 
     command.Parameters.AddWithValue("@WhenOccured", DateTime.Now); 

     command.ExecuteNonQuery(); 
    } 
    } 
    catch { } 
} 

Beachten Sie, dass Sie müssen eine Tabelle in Ihrer Datenbank erstellen mit der in dieser Funktion verwendeten Struktur.

+0

Hmm, scheint nicht zu feuern, wenn ich eine neue Ausnahme mache ... Verstehe ich nicht, wie das funktionieren soll? –

+0

Nur Raten, aber ist es, weil Sie dies im Entwicklungsmodus versuchen? Wenn dies der Fall ist, werden Fehlerdetails auf der Webseite angezeigt, anstatt LogException aufzurufen. Dies kann mit der if-Anweisung im ersten Codeblock geändert werden. – Rono

2

ELMAH wurde noch nicht zur Unterstützung von ASP.NET Core aktualisiert. Atif Azis hat einige Arbeit geleistet, indem er ein web.config kostenloses Konfigurationsmodul namens Bootstrapper erstellt hat. Bootstrapper unterstützt nicht ASP.NET Core (meines Wissens). Aber ich bin mir ziemlich sicher, dass die Arbeit an der neuen Version beginnen wird, sobald wir RTM näher kommen.

+0

Wenn Sie mich fragen, ist es dumm, einen Namen ein Modul zu gehen 'Bootstrapper', da die bekannte JS- und CSS-Bibliothek bekannt ist. – ProfK