在Web Api 2.2中,我们可以通过从控制器返回来返回位置标头URL,如下所示:
return Created(new Uri(Url.Link("GetClient", new { id = clientId })), clientReponseModel);
Url.Link(..)
将根据控制器名称GetClient
相应地解析资源URL:
在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中所做的那样?
我没有意识到,但CreatedAtAction()
方法迎合了这个:
return CreatedAtAction("GetClient", new { id = clientId }, clientReponseModel);
确保您的控制器派生自MVC的Controller。
在新的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);
}
有一个UrlHelper
类实现IUrlHelper
接口。它提供了所需的功能。
我的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;
...
}
希望有所帮助。
我使用这个简单的近似基于在Web服务器上提供的Uri:
[HttpPost]
[Route("")]
public IHttpActionResult AddIntervencion(MyNS.MyType myObject) {
return Created<MyNS.MyType>(Request.RequestUri + "/" + myObject.key, myObject);
}