大佬教程收集整理的这篇文章主要介绍了ASP.NET Core Web API异常处理,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在使用不同的异常处理方法进行了许多实验之后,我最终使用了中间件。对于我的ASP.NET Core Web API应用程序,它表现得最好。它可以处理应用程序异常以及动作过滤器中的异常,并且我可以完全控制异常处理和http响应。这是我的异常处理中间件:
public class ErrorHandlingMIDdleware
{
private Readonly requestDelegate next;
public ErrorHandlingMIDdleware(requestDelegate next)
{
this.next = next;
}
public async Task Invoke(httpContext context /* other dependencIEs */)
{
try
{
await next(context);
}
catch (Exception eX)
{
await HandleExceptionAsync(context, eX);
}
}
private static Task HandleExceptionAsync(httpContext context, Exception eX)
{
var code = httpStatusCode.InternalServerError; // 500 if unexpected
if (ex is MyNotFoundException) code = httpStatusCode.NotFound;
else if (ex is MyUnauthorizedException) code = httpStatusCode.Unauthorized;
else if (ex is MyException) code = httpStatusCode.badrequest;
var result = JsonConvert.serializeObject(new { error = ex.message });
context.Response.ContentType = "application/Json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
在课堂上 注册Startup
:
app.UseMIDdleware(typeof(ErrorHandlingMIDdlewarE));
app.UseMvc();
您可以添加堆栈跟踪,异常类型名称,错误代码或您想要的任何内容。非常灵活。这是异常响应的示例:
{ "error": "Authentication token is not valID." }
考虑序列化响应对象以利用ASP.NET
MVC的序列化设置在所有端点之间实现更好的序列化一致性时,考虑注入IOptions<MvcJsonoptions>
该Invoke
方法,然后使用该方法JsonConvert.serializeObject(errorObj,
opts.Value.serializerSetTings)
。
UseExceptionHandler
对于简单的方案,还有另一个非显而易见的API 可以正常工作:
app.UseExceptionHandler(a => a.Run(async context =>
{
var feature = context.Features.Get<IExceptionHandlerPathFeature>();
var exception = feature.Error;
var result = JsonConvert.serializeObject(new { error = exception.message });
context.Response.ContentType = "application/Json";
await context.Response.WriteAsync(result);
}));
这不是设置异常处理的非常明显但简单的方法。但是,我仍然更喜欢中间件方法,因为我获得了更多控制权并具有注入必要依赖项的能力。
在使用常规ASP.NET Web API多年之后,我将ASP.NET Core用于我的新REST API项目。我看不到任何在ASP.NET Core Web
API中处理异常的好方法。我试图实现异常处理过滤器/属性:
public class ErrorHandlingFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
HandleExceptionAsync(context);
context.ExceptionHandled = true;
}
private static void HandleExceptionAsync(ExceptionContext context)
{
var exception = context.Exception;
if (exception is MyNotFoundException)
SetExceptionResult(context,exception,httpStatusCode.NotFound);
else if (exception is MyUnauthorizedException)
SetExceptionResult(context,httpStatusCode.Unauthorized);
else if (exception is MyException)
SetExceptionResult(context,httpStatusCode.badrequest);
else
SetExceptionResult(context,httpStatusCode.InternalServerError);
}
private static void SetExceptionResult(
ExceptionContext context,Exception exception,httpStatusCode codE)
{
context.Result = new JsonResult(new ApiResponse(exception))
{
StatusCode = (int)code
};
}
}
这是我的启动过滤器注册:
services.AddMvc(options =>
{
options.Filters.Add(new AuthorizationFilter());
options.Filters.Add(new ErrorHandlingFilter());
});
我遇到的问题是,当发生异常时,AuthorizationFilter
它不会由处理ErrorHandlingFilter
。我期望它会像在旧的ASP.NET
Web API中一样被捕获。
那么,如何捕获所有应用程序异常以及动作过滤器中的任何异常?
以上是大佬教程为你收集整理的ASP.NET Core Web API异常处理全部内容,希望文章能够帮你解决ASP.NET Core Web API异常处理所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。