IApplicationBuilder.UseExceptionHandler重载未使用错误页面

时间:2019-03-05 13:40:19

标签: asp.net-core asp.net-core-2.1

我正在使用重载IApplicationBuilder.UseExceptionHandler(Action<IApplicationBuilder> configure),以便可以将任何未处理的异常条目添加到数据库中。

因此Startup.Configure中附带了一个新的ASP.NET Core 2.1 Web应用程序:

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");不会导致错误页面被点击,但是,异常将被添加到数据库中。

如何将条目添加到数据库中,然后返回“错误”页面?

为了完整起见,我只是在HomeController的Index方法中抛出一个新异常来对此进行测试,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 :(得分:0)

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");
    });
});