首页 > 解决方案 > CreatedAtAction 在带有 Api 版本控制的 Asp.Ner Core 3.1 中返回“没有路由与提供的值匹配”500 错误

问题描述

我在带有 Api 版本控制的 Asp.Net Core 3.1 中有一个 Web API 项目,设置如下:

[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
public abstract class BaseApiController : ControllerBase
{
    ...
}

我正在测试的控制器:

public class RegistrationController : BaseApiController
{
    [HttpGet]
    [Route("{id}")]
    public async Task<ActionResult<RegistrationDTO>> GetRegistration(int id)
    {
        ...
    }

    [HttpPost]
    public async Task<IActionResult> Create(RegistrationCreateDTO item, ApiVersion apiVersion)
    {
        ...
        return CreatedAtAction(nameof(GetRegistration), new { id = itemId, version = $"{apiVersion.MajorVersion.Value}" }, itemId);
    }
}

由于某种原因,除非我删除 [Route{"id"}] 并将 [HttpGet] 更改为 [HttpGet{"id"}],否则这不起作用。知道是什么导致了这种行为吗?

请注意,我在设置中没有任何特定的路线,只是一个简单的app.UseHttpsRedirection();app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

标签: asp.net-core-webapiasp.net-core-3.1

解决方案


这是一个演示:Startup.cs:

public void ConfigureServices(IServiceCollection services)
        {

            services.AddApiVersioning(o =>
            {
                o.ReportApiVersions = true;
                o.AssumeDefaultVersionWhenUnspecified = true;
                o.DefaultApiVersion = new ApiVersion(1, 0);
            });
        }


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
           app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
        }

BaseApiController:

[ApiController]
    [Route("api/v{version:apiVersion}/[controller]")]
    public class BaseApiController : ControllerBase
    {
        
    }

注册控制器:

public class RegistrationController : BaseApiController
    {
        [HttpGet]
        [Route("{id}")]
        public JsonResult GetRegistration(int id)
        {
            return new JsonResult("aa");
        }
    
    }

结果: 在此处输入图像描述


推荐阅读