相关疑难解决方法(0)

ASP.NET Core Web API异常处理

在使用常规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, exception, HttpStatusCode.Unauthorized);
        else if (exception is MyException)
            SetExceptionResult(context, exception, HttpStatusCode.BadRequest);
        else
            SetExceptionResult(context, exception, HttpStatusCode.InternalServerError);
    }

    private static void SetExceptionResult(
        ExceptionContext context, 
        Exception exception, 
        HttpStatusCode code)
    {
        context.Result = new JsonResult(new ApiResponse(exception))
        { …
Run Code Online (Sandbox Code Playgroud)

c# exception asp.net-core

230
推荐指数
8
解决办法
16万
查看次数

如何区分模型绑定错误和模型验证错误?

我正在使用 ASP.NET Core MVC 2.0 实现一个 REST API 项目,如果模型绑定失败(因为请求语法错误),我想返回 400 状态代码,如果模型验证失败,我想返回 422 状态代码(因为该请求在语法上是正确的,但包含不可接受的值)。

例如,给定一个动作,如

[HttpPut("{id}")]
public async Task<IActionResult> UpdateAsync(
    [FromRoute] int id,
    [FromBody] ThingModel model)
Run Code Online (Sandbox Code Playgroud)

id路由中的参数包含非数字字符或请求中未指定正文时,我想返回 400 状态代码,当属性ThingModel包含无效值时返回 422 状态代码。

从我所看到的情况来看,IValueProviderIModelBinder实现都ModelStateDictionary像验证器一样将它们的错误添加到请求中,并且无法在绑定和验证之间注入代码。

我怎样才能实现这样的行为?

c# model-binding model-validation asp.net-core-mvc

5
推荐指数
1
解决办法
2594
查看次数