程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ASP.NET Core Web API异常处理大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决ASP.NET Core Web API异常处理?

开发过程中遇到ASP.NET Core Web API异常处理的问题如何解决?下面主要结合日常开发的经验,给出你关于ASP.NET Core Web API异常处理的解决方法建议,希望对你解决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)

方法2

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,请注明来意。