Перегрузка IApplicationBuilder.UseExceptionHandler не использует страницу ошибки - PullRequest
0 голосов
/ 05 марта 2019

Я использую перегрузку 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();
    }
}

1 Ответ

0 голосов
/ 05 марта 2019

Ach, просто нужно добавить context.Response.Redirect("/About/Error");

Так что код

app.UseExceptionHandler(configure =>
{
    configure.Run(async context =>
    {
        UncaughtExceptionHandler uncaughtExceptionHandler = new UncaughtExceptionHandler();

        await uncaughtExceptionHandler.LogUnhandledException(
            context.Features.Get<IExceptionHandlerFeature>().Error,
            Configuration.GetConnectionString("RemoteConnection"));

        context.Response.Redirect("/Home/Error");
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...