LinkGenerator.GetUriByAction 不遵循自定义路线

LinkGenerator.GetUriByAction not following the custom route

那是控制器:

[ApiController]
[Route("api/[controller]")
public class MarketController : ControllerBase
{
  [HttpGet("{id}/picture")
  public async Task<IActionResult> GetPictureAsync(Guid id)
  {
    ...
  }
}

我正在使用 LinkGenerator 从 GetPictureAsync 创建绝对 URI。并设置 Startup class 以作为 DI 启动 HttpContextAccessor。

// Startup.cs
...
public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddHttpContextAccessor();
  ...
}

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

在我的习惯中 class 我是这样使用的:

public class CustomClass
{
  private readonly IHttpContextAccessor _httpContextAccessor;
  private readonly LinkGenerator _linkGenerator;

  public CustomClass(IHttpContextAccessor httpContextAccessor,
    LinkGenerator linkGenerator)
  {
    _httpContextAccessor = httpContextAccessor;
    _linkGenerator = linkGenerator;
  }

  public void SomeMethod()
  {
    var uri = _linkGenerator.GetUriByAction(_httpContextAccessor.HttpContext, "GetPicture", "Markets", new { id = id });
  }

}

问题是因为 LinkGenerator 没有遵循我在 GetPicture 方法中设置的自定义路由示例。

LinkGenerator 生成以下值:

https://localhost:5051/Markets/GetPicture/00748d23-afa7-4efb-b67b-77f68fdc44d5

但它应该生成:

https://localhost:5051/api/Markets/00748d23-afa7-4efb-b67b-77f68fdc44d5/picture

原因是您在 SomeMethod 中使用了错误的控制器名称。 按照您提供的步骤操作,我重现了您的问题。

您应该使用 Market,而不是 Markets

因为你的控制器名称是MarketController

测试后,对我有用。