2016-01-29 14 views
6

Sono un po 'confuso su come utilizzare Elmah nei progetti ASP.NET 5/MVC 6. Ho ricevuto il pacchetto da nuget e ha aggiunto "Elmah.Mvc": "2.1.2" alle dipendenze in project.json.Come si usa Elmah in ASP.NET 5/vNext/Core?

Non sono sicuro di dove andare da qui - indietro nel giorno, nuget aggiungerebbe voci al web.config che ora è andato. E non riesco a trovare alcun esempio sul loro GitHub o altrove.

Mi manca qualcosa di semplice?

+0

Non tutti i pacchetti sono stati aggiornati per essere compatibili con ASP.NET Core. Dato il livello di integrazione necessario tra Elmah e lo stack ASP.NET, direi che Elmah non è stato ancora aggiornato. – mason

+0

Possibile duplicato di [ELMAH su ASP.NET vNext?] (Http://stackoverflow.com/questions/28907017/elmah-on-asp-net-vnext) – blowdart

risposta

10

Invece di utilizzare ELMAH, non è difficile implementare manualmente la registrazione degli errori. Questo processo cattura qualsiasi eccezione che si verifica nel progetto e la registra in una tabella di database. Per fare questo, aggiungere il seguente al metodo di configurazione 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); 
      } 
     }); 
     }); 
    } 

includere questo nella Startup.cs così:

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 { } 
} 

noti che si dovrà creare una tabella nel database con la struttura utilizzata in questa funzione.

+0

Hmm, non sembra sparare quando lancio una nuova eccezione ... Non capisco come dovrebbe funzionare? –

+0

Solo a indovinare, ma è perché stai provando questo in modalità di sviluppo? In tal caso, verranno visualizzati i dettagli dell'errore nella pagina Web anziché chiamare LogException. Questo può essere modificato con l'istruzione if nel primo blocco di codice. – Rono

2

ELMAH non è stato ancora aggiornato per supportare ASP.NET Core. Atif Azis ha fatto del lavoro per creare un modulo di configurazione gratuito web.config chiamato Bootstrapper. Bootstrapper non supporta ASP.NET Core (per quanto ne so). Ma sono abbastanza sicuro che il lavoro a supporto della nuova versione inizierà non appena ci avvicineremo a RTM.

+0

Se mi chiedi, è un po 'un nome un modulo 'Bootstrapper', dato che è così noto il noto archivio JS e CSS. – ProfK