MVC 6 Web Api:解析201(创建)上的位置标题

时间:2015-08-12 05:58:38

标签: asp.net-core asp.net-core-mvc dnx

在Web Api 2.2中,我们可以通过从控制器返回来返回位置标题URL,如下所示:

return Created(new Uri(Url.Link("GetClient", new { id = clientId })), clientReponseModel);

Url.Link(..)将根据控制器名称GetClient

相应地解析资源URL

Location header

在ASP.NET 5 MVC 6的Web Api中,Url在框架中不存在,但CreatedResult构造函数确实具有location参数:

return new CreatedResult("http://www.myapi.com/api/clients/" + clientId, journeyModel);

如何在不必手动提供此URL的情况下解析此URL,就像我们在Web API 2.2中所做的那样?

6 个答案:

答案 0 :(得分:13)

我没有意识到这一点,但CreatedAtAction()方法可以满足这一要求:

return CreatedAtAction("GetClient", new { id = clientId }, clientReponseModel);

确保您的控制器派生自MVC的Controller。

答案 1 :(得分:5)

在新的ASP.NET MVC Core中有一个属性Url,它返回IUrlHelper的实例。您可以使用它来生成本地URL:

[HttpPost]
public async Task<IActionResult> Post([FromBody] Person person)
{
  _DbContext.People.Add(person);
  await _DbContext.SaveChangesAsync();

  return Created(Url.RouteUrl(person.Id), person.Id);
}

答案 2 :(得分:2)

UrlHelper类实现IUrlHelper接口。 它提供了所需的功能。

Source code

答案 3 :(得分:0)

我的GET操作有一个路由名称

    [HttpGet("{id:int}", Name = "GetOrganizationGroupByIdRoute")]
    public async Task<IActionResult> Get(int id, CancellationToken cancellationToken = default(CancellationToken))
    {
        ...
    }

我的POST操作使用该路由名称返回URL

    [HttpPost]
    public async Task<HttpStatusCodeResult> Post([FromBody]OrganizationGroupInput input, CancellationToken cancellationToken = default(CancellationToken))
    {
        ...
        var url = Url.RouteUrl("GetOrganizationGroupByIdRoute", new { id = item.Id }, Request.Scheme, Request.Host.ToUriComponent());
        Context.Response.Headers["Location"] = url;
        ...
    }

使用Fiddler产生的反应 enter image description here

希望有所帮助。

答案 4 :(得分:0)

还有CreatedAtRoute

public async Task<IActionResult> PostImpl([FromBody] Entity entity)
{
  ...

  return CreatedAtRoute(entity.Id, entity);
  //or
  return CreatedAtRoute(new { id = entity.Id }, entity);      
}

答案 5 :(得分:-1)

我使用基于在Web服务器上提供的Uri的这种简单近似:

[HttpPost]
[Route("")]
public IHttpActionResult AddIntervencion(MyNS.MyType myObject) {
  return Created<MyNS.MyType>(Request.RequestUri + "/" + myObject.key, myObject);
}