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
参数来修改上述代码。
我正在 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
参数来修改上述代码。