我正在研究.NET核心Web应用程序,我的要求是全局处理错误。
所以为了实现这个行为,我尝试使用中间件UseExceptionHandler和ExceptionHandlerOptions构建。
Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(new ExceptionHandlerOptions {
ExceptionHandlingPath = "/Home/Error",
ExceptionHandler = async (context) => {
var exceptionFeature = context.Features.Get<IExceptionHandlerFeature>();
if (exceptionFeature != null)
{
Log.Error(exceptionFeature.Error, exceptionFeature.Error.Message);
}
}
});
}
}
上面的代码记录了日志文件中的错误,但从未将用户重定向到错误页面。当我删除ExceptionHandler函数时,它工作正常,并将用户重定向到错误页面。如果我错过了什么,请纠正我。
我希望用户在发生任何未处理的异常时应重定向到错误页面并将错误记录在日志文件中。
我解决这个问题的方法:
Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
}
HomeController.cs
public async Task<IActionResult> Error(string errorId)
{
var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
if (exceptionFeature != null)
{
Log.Error(exceptionFeature.Error, exceptionFeature.Error.Message);
}
}
以上解决方案对我有用,但在控制器中记录全局错误是一种好习惯吗?任何领导都会受到关注。
谢谢!
这两个属性是互斥的,ExceptionHandlingPath =“/ Home / Error”,ExceptionHandler,即其中任何一个都将被应用,这就是为什么重定向不会发生在home / error中。如果您将删除exceptionHandler,它将适用于您,但是您需要在控制器中进行登录,这是您执行的第二个实现的一部分,并且在此控制器/操作执行操作之前记录它没有任何害处处理一切。
当我说一切,这意味着,有401错误,404错误,当前的方法将无法处理,为此你应该使用statusCode基本方法。
更好的方法是你有多个错误页面的实现:1。404:路由不存在2. 500:应用程序错误(所有情况)3 401:如果涉及某种授权。
.net core提供了很多错误处理机制(包括用于异常处理的Globalfilterattributes)。但是,如果您有一个面向公众的应用程序,则应该将目标显示为用户友好的错误页面并记录其余部分。
你可以读一下here