【发布时间】:2020-05-05 16:38:18
【问题描述】:
我有一个调用服务类的 API 控制器。在服务类内部,我想抛出一个异常,以便 API 控制器可以捕获它,并返回一个 Http-BadRequest 响应。 但是什么异常等于 Bad Request?对于这种情况,最佳做法是什么?
【问题讨论】:
标签: asp.net asp.net-core
我有一个调用服务类的 API 控制器。在服务类内部,我想抛出一个异常,以便 API 控制器可以捕获它,并返回一个 Http-BadRequest 响应。 但是什么异常等于 Bad Request?对于这种情况,最佳做法是什么?
【问题讨论】:
标签: asp.net asp.net-core
我使用这种模式在应用层抛出异常,并且 api 层会识别 http 状态码:
异常定义:
public class BadRequestException : Exception
{
public BadRequestException(string message = null)
: base(message == null ? "Bad Request" : message)
{ }
}
public class ActionInputIsNotValidException : BadRequestException
{
public ActionInputIsNotValidException()
: base("Action input is not valid")
{ }
}
在 api 层处理异常的动作过滤器:
public class ExceptionActionFilter : ExceptionFilterAttribute
{
public ExceptionActionFilter()
{
}
public override void OnException(ExceptionContext context)
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
context.HttpContext.Response.ContentType = "application/json";
if (isTypeOf(context.Exception, typeof(Exceptions.BadRequestException)))
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
context.Result = new JsonResult(new
{
Message = context.Exception.Message,
});
}
private bool isTypeOf(Exception exception, Type baseType)
{
return exception.GetType() == baseType || exception.GetType().IsSubclassOf(baseType);
}
}
然后在应用层我们可以抛出异常,api调用的结果将是一个json,包含带有http 400状态码的错误消息:
throw new ActionInputIsNotValidException();
【讨论】: