簡體   English   中英

CreatedAtAction 不尊重在 controller in.Net Core 3.0 中設置的路由模板

[英]CreatedAtAction not respecting route template set in controller in .Net Core 3.0

我正在構建一個寧靜的 api ,它在命中適當的端點時返回201 Created 為了做到這一點,我嘗試同時使用CreatedAtActionCreatedAtRoute方法,但它們都無法遵守 controller 頂部(或操作頂部)定義的路由,而是使用startup.cs中存在的default路由。 如果我在 controller 的頂部命名路由,並使用CreatedAtRoute ,它將部分尊重路由,但它將id字段作為查詢字符串參數傳遞,而不是將其用作路由的一部分(如操作指定) .

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]", Name = "Organizations")]
public class OrganizationsController : BaseController
{
    [HttpGet("{id}", Name = "GetOrganization")]
    public async Task<IActionResult> GetOrganization(string id)
    {
        var command = new GetOrganizationQuery(id);

        return Ok(await Mediator.Send(command));
    }

    [HttpPost]
    [ProducesResponseType(StatusCodes.Status201Created)]
    public async Task<IActionResult> CreateOrganization(CreateOrganizationCommand command)
    {
        var organization = await Mediator.Send(command);
        return CreatedAtAction("GetOrganization", "Organizations",
            new {id = organization.Id}, organization);
    }  
}

如果我使用:

return CreatedAtAction("GetOrganization", "Organizations", new {id = organization.Id}, organization);
// or
return CreatedAtAction("GetOrganization", new {id = organization.Id}, organization);

位置 header 是location: https://localhost:5001/Organizations/GetOrganization/08d76ebb-95a9-ec4c-7bea-dbb5ff20cf06


如果我使用:

return CreatedAtRoute("GetOrganization",new {id = organization.Id}, organization);

我收到一個錯誤, No route matches the supplied values. .


如果我使用:

return CreatedAtRoute("Organizations",new {id = organization.Id}, organization);

我非常接近,但 ID 被添加為查詢字符串,如下所示: location: https://localhost:5001/api/v1/Organizations?id=08d76ebc-4b79-d9bf-32e9-3cf4202ebce7

如果我嘗試將 ID 作為 controller 上的可選參數,它會附加到 controller 內的所有操作中,這也不是一個可行的解決方案。

將位置設置為正確路線的正確方法是什么?

所以事實證明,錯誤的根源實際上是路由中存在的ApiVersion 即使應用程序設置為將AssumeDefaultVersionWhenUnspecified設置為 true,該值似乎也不會影響內部路由。 為了讓應用程序選擇正確的路線,我必須在CreatedAtAction方法中指定 api 版本,如下所示:

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class OrganizationsController : BaseController
{
    [HttpGet("{id}")]
    public async Task<IActionResult> GetOrganization(string id)
    {
        var command = new GetOrganizationQuery(id);

        return Ok(await Mediator.Send(command));
    }

    [HttpPost]
    [ProducesResponseType(StatusCodes.Status201Created)]
    public async Task<IActionResult> CreateOrganization(CreateOrganizationCommand command, ApiVersion version)
    {
        var organization = await Mediator.Send(command);
        return CreatedAtAction(nameof(GetOrganization),
            new { id = organization.Id, version = version.ToString() }, 
            organization);
    }  
}

你可以 在這里看到更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM