0

После некоторого исследования я не смог найти способ захватить исключения приложений в asp.net core mvc с сохранением поведения страницы с ошибкой по умолчанию. На самом деле существует два способа для пользовательских ошибок обработки приложений. Первый и простой способ - настроить app.UseExceptionHandler("/Home/Error"); в файле Startup.cs, но таким образом я потерял стандартную страницу с ошибкой по умолчанию. Другое решение, чтобы настроить обработку ошибок в ASP.NET MVC ядра является определение обработчика исключений инлайн, но это приведет к странице ошибки по умолчанию для переопределения, а также:Сведения об исключении приложения захвата Asp.Net Core MVC

app.UseExceptionHandler(
options => { 
    options.Run(
    async context => 
    { 
     context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     context.Response.ContentType = "text/html"; 
     var ex = context.Features.Get<IExceptionHandlerFeature>(); 
     if (ex != null) 
     { 
     var err = $"<h1>Error: {ex.Error.Message}</h1>{ex.Error.StackTrace }"; 
     await context.Response.WriteAsync(err).ConfigureAwait(false); 
     } 
    }); 
} 
); 

Мне нужно только, чтобы захватить подробную информацию об ошибке, без перекрывая поведение по умолчанию (симпатичная страница ошибок по умолчанию и т. д.). Мне не нужен какой-либо пользовательский обработчик исключений, на самом деле мне просто нужно получить исключение. Я бы хотел сделать это на уровне приложения, поэтому пользовательский ExceptionHandlerAttribute, который реализует IExceptionFilter, не будет работать. Это решение удалит страницу ошибки по умолчанию, также мне нужно уловить ошибки промежуточного программного обеспечения, а не только исключения для диспетчера. После подход не применяется:

public class CustomExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext context) 
    { 
     HttpStatusCode status = HttpStatusCode.InternalServerError; 
     String message = String.Empty; 

     var exceptionType = context.Exception.GetType(); 
     if (exceptionType == typeof(UnauthorizedAccessException)) 
     { 
      message = "Unauthorized Access"; 
      status = HttpStatusCode.Unauthorized; 
     } 
     else if (exceptionType == typeof(NotImplementedException)) 
     { 
      message = "A server error occurred."; 
      status = HttpStatusCode.NotImplemented; 
     } 
     else if (exceptionType == typeof(MyAppException)) 
     { 
      message = context.Exception.ToString(); 
      status = HttpStatusCode.InternalServerError; 
     } 
     else 
     { 
      message = context.Exception.Message; 
      status = HttpStatusCode.NotFound; 
     } 
     HttpResponse response = context.HttpContext.Response; 
     response.StatusCode = (int)status; 
     response.ContentType = "application/json"; 
     var err = message + " " + context.Exception.StackTrace; 
     response.WriteAsync(err); 
    } 
} 

Это страница, которую я хотел бы, чтобы: default error page pretty view

ответ

0

Решение использовать Elm для ASP.NET основных приложений, образец кода обеспечивается Microsoft на своей учетной записи GitHub: https://github.com/aspnet/Diagnostics, также есть переработанная, стабильная версия регистратора ASP.NET Core MVC, описанная в моей статье https://www.codeproject.com/Articles/1164750/Error-logging-in-ASP-NET-Core-MVC-Elmah-for-Net-Co. Счастливое кодирование!