我应该 return 状态代码还是在 .Net Web 中抛出异常 Api 2

Should I return a status code or throw an exception in .Net Web Api 2

我见过像this

这样的例子
public IHttpActionResult GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return Ok(item);
}

但我也认为这是一个选择

public IHttpActionResult GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        return NotFound();
    }
    return Ok(item);
}

抛出异常或简单地返回 NotFound(IHttpActionResult 实例)是否有优势?

我知道在响应/请求管道中有一些阶段可以处理这些结果中的任何一个,例如第一个示例

public class NotFoundExceptionFilterAttribute : ExceptionFilterAttribute 
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotFoundException)
        {
            // Do some custom stuff here ...
            context.Response = new HttpResponseMessage(HttpStatusCode.NotFound);
        }
    }
}

...

GlobalConfiguration.Configuration.Filters.Add(
    new ProductStore.NotFoundExceptionFilterAttribute());

抛出异常总是应该被视为异常情况。虽然很少见,但仍有可能发生,应妥善处理。

这取决于您需要多久从数据库中检索不存在的项目。请记住,异常抛出通常总是性能杀手。

你也应该看看这个:

When to throw an exception?

IHttpActionResult 是 WebApi 2 中添加的功能。您仍然可以使用 WebApi 1 中的传统方法,即创建 HttpResponseMessage 或抛出 HttpResponseException ,但开发 IHttpActionResult 是为了简化流程。

IHttpActionResult接口有一个方法:

public interface IHttpActionResult
{
    Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}

NotFound method simply creates a NotFoundResult,其中 return 是一个带有 HttpStatusCode.NotFound 的空响应。这本质上与 throwing HttpResponseException(HttpStatusCode.NotFound) 完全相同,但语法更统一。

IHttpActionResult 界面还允许您轻松创建自定义 ActionResult 类 到 return 任何 HttpStatusCode 或您想要的任何内容类型。