空响应返回204

时间:2018-07-18 22:10:08

标签: c# asp.net-core asp.net-core-2.1

当我执行GET请求并且找不到任何数据时,控制器返回204。

[Route("user/v1/[controller]")]
public class UserLoginController : Controller
{
    [HttpGet]
    public async Task<UserLogin> Get(int userId)
    {
        var userLoginLogic = new UserLoginLogic();

        return await userLoginLogic.GetUserLogin(userId);
    }
}

这仅用于GET请求,POST,PUT,DELETE返回20​​0空响应。这不符合我的招摇定义,该定义为200个响应定义了一个响应,我宁愿保持一致。

如果我通过该控制器提供HTML,但204用于REST API,则204会很好。

我如何得到它返回200?

2 个答案:

答案 0 :(得分:5)

使用v2.1 +中的新ActionResult<T>,您还可以重构为,可以明确地告诉控制器使用Ok()帮助方法ok 200

[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        return Ok(model);
    }
}

但是,如果实际上没有要返回的内容,这可能会产生误导。考虑使用适当的响应状态

[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        if(model == null) return NotFound(); //404
        return Ok(model); //200
    }
}

如果打算返回200 Ok,但没有内容

[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        if(model == null) return Ok()(); //200 with no content
        return Ok(model); //200
    }
}

引用Controller action return types in ASP.NET Core Web API:

答案 1 :(得分:2)

请参阅:


services.AddControllers(opt =>  // or AddMvc()
{
    // remove formatter that turns nulls into 204 - No Content responses
    // this formatter breaks Angular's Http response JSON parsing
    opt.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
})