Я использую перегрузку IApplicationBuilder.UseExceptionHandler(Action<IApplicationBuilder> configure)
, чтобы я мог добавить запись в свою базу данных для любых необработанных исключений.
Итак, новое веб-приложение ASP.NET Core 2.1 поставляется с этим в Startup.Configure
:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
, где я переключился app.UseExceptionHandler("/Home/Error");
с
//app.UseExceptionHandler("/Home/Error");
app.UseExceptionHandler(configure =>
{
configure.Run(async context =>
{
UncaughtExceptionHandler uncaughtExceptionHandler = new UncaughtExceptionHandler();
await uncaughtExceptionHandler.LogUnhandledException(
context.Features.Get<IExceptionHandlerFeature>().Error,
Configuration.GetConnectionString("RemoteConnection"));
});
//configure.UseExceptionHandler("/Home/Error");
});
Если я раскомментирую app.UseExceptionHandler("/Home/Error");
, то попадет страница Ошибка, но исключение не будет добавлено в таблицу ошибок моей базы данных. Не имеет значения, помещаю ли я строку до или после перегрузки UseExceptionHandler
.
Закомментированный configure.UseExceptionHandler("/Home/Error");
не приведет к попаданию на страницу ошибки, однако исключение будет добавлено в базу данных.
Как добавить запись в свою базу данных, а затем вернуть страницу с ошибкой?
Для полноты картины я просто добавляю новое исключение в метод Index на HomeController, чтобы проверить это, и код в UncaughtExceptionHandler
равен
public class UncaughtExceptionHandler
{
public async Task LogUnhandledException(Exception exception, string connectionString)
{
DbContextOptionsBuilder<DbSh> builder = new DbContextOptionsBuilder<DbSh>();
builder.UseSqlServer(connectionString);
DbSh dbForUnhandledError = new DbSh(builder.Options);
string message = exception.Message;
if (message != null && message.Length > 32) message = message.Substring(0, 32);
Error error = new Error(exception, "Exception caught in ShWeb.Infrastructure.UncaughtExceptionHandler");
dbForUnhandledError.Errors.Add(error);
var result = await dbForUnhandledError.SaveChangesAsync();
dbForUnhandledError.Dispose();
}
}