我正在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中间件,它覆盖了我对状态代码的更改。是对的吗?如果是这样, 它应该覆盖我的状态代码还是错误?如果这是正确的行为,我该如何进行重定向?
答案 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
参数来修改上述代码。