После некоторого исследования я не смог найти способ захватить исключения приложений в 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);
}
}
Это страница, которую я хотел бы, чтобы: