2

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

在我的 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 中间件覆盖我对状态代码的更改。那正确吗?如果是这样,它应该覆盖我的状态代码还是一个错误?如果这是正确的行为,我应该如何进行重定向?

4

1 回答 1

3

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

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

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

于 2015-06-15T10:53:24.850 回答