首页 > 解决方案 > LinkGenerator.GetUriByAction 不遵循自定义路线

问题描述

那是控制器:

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

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

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

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

在我的自定义类中,我使用这种方式:

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

标签: apiasp.net-corecontroller

解决方案


原因是您在SomeMethod. 按照您提供的步骤,我重现了您的问题。

你应该使用Market,而不是Markets

因为您的控制器名称是MarketController.

经过测试,它对我有用。

在此处输入图像描述

在此处输入图像描述


推荐阅读