MVC 6 Web Api:解析 201 上的位置 header(已创建)
MVC 6 Web Api: Resolving the location header on a 201 (Created)
在 Web Api 2.2 中,我们可以通过从控制器 returning return 位置 header 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
构造函数确实具有位置参数:
return new CreatedResult("http://www.myapi.com/api/clients/" + clientId, journeyModel);
如何解决此问题 URL 而无需手动提供它,就像我们在 Web API 2.2 中所做的那样?
有一个 UrlHelper
class 实现了 IUrlHelper
接口。
它提供了请求的功能。
我没意识到,但是 CreatedAtAction()
方法适合这个:
return CreatedAtAction("GetClient", new { id = clientId }, clientReponseModel);
确保您的控制器派生自 MVC 的控制器。
我的 GET 操作有一个路由名称
[HttpGet("{id:int}", Name = "GetOrganizationGroupByIdRoute")]
public async Task<IActionResult> Get(int id, CancellationToken cancellationToken = default(CancellationToken))
{
...
}
我的 POST 操作使用该路由名称 return 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 生成的响应
希望对您有所帮助。
我根据在 Web 服务器上提供的 Uri 使用这个简单的近似值:
[HttpPost]
[Route("")]
public IHttpActionResult AddIntervencion(MyNS.MyType myObject) {
return Created<MyNS.MyType>(Request.RequestUri + "/" + myObject.key, myObject);
}
在新的 ASP.NET MVC Core 中有一个 属性 Url
,其中 returns 是 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);
}
还有CreatedAtRoute
:
public async Task<IActionResult> PostImpl([FromBody] Entity entity)
{
...
return CreatedAtRoute(entity.Id, entity);
//or
return CreatedAtRoute(new { id = entity.Id }, entity);
}
在 Web Api 2.2 中,我们可以通过从控制器 returning return 位置 header URL 如下:
return Created(new Uri(Url.Link("GetClient", new { id = clientId })), clientReponseModel);
Url.Link(..)
将根据控制器名称 GetClient
:
在ASP.NET 5 MVC 6 的 Web Api 中,Url
在框架中不存在,但 CreatedResult
构造函数确实具有位置参数:
return new CreatedResult("http://www.myapi.com/api/clients/" + clientId, journeyModel);
如何解决此问题 URL 而无需手动提供它,就像我们在 Web API 2.2 中所做的那样?
有一个 UrlHelper
class 实现了 IUrlHelper
接口。
它提供了请求的功能。
我没意识到,但是 CreatedAtAction()
方法适合这个:
return CreatedAtAction("GetClient", new { id = clientId }, clientReponseModel);
确保您的控制器派生自 MVC 的控制器。
我的 GET 操作有一个路由名称
[HttpGet("{id:int}", Name = "GetOrganizationGroupByIdRoute")]
public async Task<IActionResult> Get(int id, CancellationToken cancellationToken = default(CancellationToken))
{
...
}
我的 POST 操作使用该路由名称 return 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 生成的响应
希望对您有所帮助。
我根据在 Web 服务器上提供的 Uri 使用这个简单的近似值:
[HttpPost]
[Route("")]
public IHttpActionResult AddIntervencion(MyNS.MyType myObject) {
return Created<MyNS.MyType>(Request.RequestUri + "/" + myObject.key, myObject);
}
在新的 ASP.NET MVC Core 中有一个 属性 Url
,其中 returns 是 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);
}
还有CreatedAtRoute
:
public async Task<IActionResult> PostImpl([FromBody] Entity entity)
{
...
return CreatedAtRoute(entity.Id, entity);
//or
return CreatedAtRoute(new { id = entity.Id }, entity);
}