web-dev-qa-db-ja.com

MVC 6 Web Api:201のロケーションヘッダーを解決(作成済み)

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 MVC6のWebApiでは、Urlはフレームワーク内に存在しませんが、CreatedResultコンストラクターにはlocationパラメーターがあります。

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

Web API 2.2で行ったように、手動で指定せずにこのURLを解決するにはどうすればよいですか?

11
Dave New

私はそれを認識していませんでしたが、CreatedAtAction()メソッドはこれに対応しています。

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

コントローラがMVCのコントローラから派生していることを確認してください。

13
Dave New

新しい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);
}
6
Shimmy

UrlHelperインターフェースを実装するIUrlHelperクラスがあります。要求された機能を提供します。

ソースコード

2
mbudnik

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

お役に立てば幸いです。

0
mcbowes