Web Api 2.2では、次のようにコントローラーから返すことで、ロケーションヘッダーのURLを返すことができました。
_return Created(new Uri(Url.Link("GetClient", new { id = clientId })), clientReponseModel);
_
Url.Link(..)
は、コントローラー名GetClient
に基づいて、それに応じてリソースURLを解決します。
ASP.NET 5 MVC6のWebApiでは、Url
はフレームワーク内に存在しませんが、CreatedResult
コンストラクターにはlocationパラメーターがあります。
_return new CreatedResult("http://www.myapi.com/api/clients/" + clientId, journeyModel);
_
Web API 2.2で行ったように、手動で指定せずにこのURLを解決するにはどうすればよいですか?
私はそれを認識していませんでしたが、CreatedAtAction()
メソッドはこれに対応しています。
return CreatedAtAction("GetClient", new { id = clientId }, clientReponseModel);
コントローラがMVCのコントローラから派生していることを確認してください。
新しいASP.NETMVCコアには、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;
...
}
お役に立てば幸いです。