在API方法中返回HttpStatusCode

10

如果API方法出现问题,我该如何在ASP.NET Core 1.0中返回一个HttpStatus代码?

如果该方法应该返回特定的对象类型,当我尝试返回Http状态码时,会出现错误,提示我无法将我的对象转换为状态码。

[HttpPost]
public async Task<SomeObject> Post([FromBody] inputData)
{
   // I detect an error and want to return BadRequest HttpStatus
   if(inputData == null)
       return new HttpStatusCode(400);

   // All is well, so return the object
   return myObject;
}

错误是正确的,您应该考虑返回 Task<IHttpActionResult> 并将返回更改为 return Ok(myObject); - Kien Chu
在WebAPI中,您可以使用特定的响应代码(由枚举表示)抛出异常。它不会让异常向上冒泡到堆栈,而是简单地返回您指定的状态码。throw new HttpResponseException(HttpStatusCode.NotFound); - James
@James 谢谢您的回复,但我很难找到HttpResponseException。看起来它在System.Web.Http命名空间中,但我的ASP.NET Core 1.0甚至不让我引用它。它建议我安装这个NuGet包https://www.nuget.org/packages/Microsoft.AspNet.Mvc.WebApiCompatShim/。在ASP.NET Core 1.0中处理它的方式仍然正确吗? - Sam
1个回答

12

在您的控制器操作中返回一个IActionResult

public async Task<IActionResult> Post([FromBody] InputData inputData)
{
    if(inputData == null)
    {
        return new HttpStatusCodeResult((int) HttpStatusCode.BadRequest);
    }

    //...

    return Ok(myObject);
}

如果您想从控制器中删除这样的空值检查,可以定义一个自定义属性:

public class CheckModelForNullAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.ActionArguments.Any(k => k.Value == null))
        {
            context.Result = new BadRequestObjectResult("The model cannot be null");
        }
    }
}

这样我们就不必担心在操作中模型为空。

[HttpPost]
[CheckModelForNull]
public async Task<SomeObject> Post([FromBody]InputData inputData)
{
    // My attribute protects me from null
    // ...
    return myObject;
}

谢谢您的建议,但我不应该做任何这样的事情。我也不应该安装兼容性包来使ASP.NET Core 1.0 API更像旧版本。我真正想学习的是在ASP.NET Core 1.0 API中正确返回HttpStatus代码的方法。 - Sam
再次感谢您的帮助。这就是我遇到的错误:“无法隐式地将类型 'HttpStatusCodeResult' 转换为 'SomeObject'。这正是我一直在努力解决的问题。 - Sam
抱歉!我撤回之前的话!我刚刚注意到你正在返回IActionResult,并将对象与StatusCode一起发送。这样做可以正常工作。感谢你的帮助! - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接