![](/img/trans.png)
[英]Asp.Net Core 3.0 CreatedAtAction returns "no route matches the supplied values" when Action name ends with "Async"
[英]CreatedAtAction not respecting route template set in controller in .Net Core 3.0
我正在構建一個寧靜的 api ,它在命中適當的端點時返回201 Created
。 為了做到這一點,我嘗試同時使用CreatedAtAction
和CreatedAtRoute
方法,但它們都無法遵守 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.