我正在使用重载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();
}
}
答案 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");
});
});