ASP.NET vnext 覆盖控制器中设置的状态代码。这是一个错误吗?

ASP.NET vnext overriding status code set in controller. Is this a bug?

我正在 Mac 上的 asp.net vnext 中构建一个简单的 WebApi。我已经按照 this tutorial 中设置的示例进行操作,但是我遇到了一个问题,我在控制器方法中设置的响应代码被覆盖了

在我的 CrudController 中使用这个方法:

[HttpPost]
public void Post([FromBody]CrudObject crudObject)
{
   var url = Url.RouteUrl("GetByIdRoute", new {id = 1}, 
       Request.Scheme, Request.Host.ToUriComponent());
   Context.Response.StatusCode = 201;
   Context.Response.Headers["Location"] = url;
 }

当我 curl 这个或用 PostMan 击中它时,我 应该 看到一个 201 Created 响应和一个 Location header 指向另一个 url。当我 运行 使用红隼时,我得到了位置 header 但响应代码是 204 无内容。

我假设这是 vnext 中间件覆盖了我对状态代码的更改。是对的吗?如果是这样,应该它会覆盖我的状态代码还是错误?如果这是正确的行为,我应该如何进行重定向?

void returning 操作的行为已 recently 更改为不转换为 204 状态代码。但是,对于您的场景,您可以使用 CreatedAtRoute 辅助方法(这实际上创建了一个 CreatedAtRouteResult),它设置 Location header.

[HttpPost]
public void Post([FromBody]CrudObject crudObject)
{
    return CreatedAtRoute(routeName: "GetByIdRoute", routeValues: new { id = 1 }, value: null);
}

您是故意不想 return 创建的 object 返回给客户端吗?如果没有,您可以通过不将 null 传递给 value 参数来修改上述代码。