2016-01-29 2 views
6

Я немного смущен тем, как использовать Elmah в проектах ASP.NET 5/MVC 6. Я получил пакет от nuget и добавил "Elmah.Mvc": "2.1.2" к зависимостям в project.json.Как использовать Elmah в ASP.NET 5/vNext/Core?

Я не уверен, куда идти отсюда - в тот же день nuget добавит записи в web.config, который теперь ушел. И я не могу найти примеров на их github или в другом месте.

Я пропустил что-то простое?

+0

Не все пакеты обновлены для совместимости с ядром ASP.NET. Учитывая уровень интеграции, необходимый между Elmah и стекю ASP.NET, я бы сказал, что Elmah еще не обновлен. – mason

+0

Возможный дубликат [ELMAH на ASP.NET vNext?] (Http://stackoverflow.com/questions/28907017/elmah-on-asp-net-vnext) – blowdart

ответ

10

Вместо использования ELMAH нетрудно вручную выполнить регистрацию ошибок. Этот процесс поймает любое исключение, которое происходит в проекте, и зарегистрирует его в таблице базы данных. Чтобы сделать это, добавьте следующие строки в методе Configure в 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); 
      } 
     }); 
     }); 
    } 

Включите это в Startup.cs, а также:

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

Обратите внимание, что вы должны создать таблицу в базе данных со структурой, используемой в этой функции.

+0

Хм, похоже, не срабатывает, когда я бросаю новое исключение ... Разве я не понимаю, как это должно работать? –

+0

Просто гадать, но ведь это потому, что вы пытаетесь это сделать в режиме разработки? Если это так, на странице будут отображаться сведения об ошибках вместо вызова LogException. Это можно изменить с помощью оператора if в первом блоке кода. – Rono

2

ELMAH еще не обновлен для поддержки ядра ASP.NET. Atif Azis сделал некоторые работы по созданию бесплатного модуля конфигурации web.config под названием Bootstrapper. Bootstrapper не поддерживает ASP.NET Core (насколько мне известно). Но я уверен, что работа, поддерживающая новую версию, начнется, как только мы приблизимся к RTM.

+0

Если вы спросите меня, это глупо назвать имя модуля 'Bootstrapper', так как известна известная JS и CSS-библиотека. – ProfK

Смежные вопросы