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

时间:2015-06-15 08:13:30

标签: macos asp.net-core kestrel-http-server

我正在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;
 }

当我卷曲它或用PostMan命中时,我应该看到201 Created响应和Location头指向另一个url。当我使用kestrel运行它时,我获得了Location头,但响应代码是204 No Content。

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

1 个答案:

答案 0 :(得分:3)

void返回操作的行为recently已更改为不转换为204状态代码。但是,对于您的方案,您可以使用CreatedAtRoute辅助方法(这实际上会创建CreatedAtRouteResult)来设置Location标题。

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

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