IApplicationBuilder.UseBasePath 奇怪的行为?

Not*_*bad 6 .net asp.net routes .net-core asp.net-core

我正在尝试向我的 web api 添加版本控制,在阅读了 asp .net core 文档后,似乎 IApplicationBuilder.UsePathBase 可以达到此目的。而且,确实如此,但有一个怪癖。无需添加版本控制路径,仍然可以访问 api。

作为示例,我使用它向我的 api 添加 v1 路径:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHttpContextAccessor httpAccesor)
{
    app.UsePathBase("/api/v1");
    ....
}
Run Code Online (Sandbox Code Playgroud)

现在我可以使用 http://www...com/api/v1/cars 或使用 http://www...com/cars 访问我的汽车端点。

汽车控制器路由设置如下:

[Authorize]
[Route("/[controller]")]
[ApiController]
public class DriversController : ControllerBase
{
  ....
}
Run Code Online (Sandbox Code Playgroud)

那么,这就是它的工作原理吗?是否有可能只允许具有相应版本控制路径的路径?

Muk*_*iya 3

根据文档,这里从请求中提取指定的路径。如果请求中未提供,则会被忽略。

它对于微服务架构很有用,其中多个微服务由 docker 托管,并且负载均衡器可以根据请求路径路由请求。因此不需要进行任何 URL 映射或重写路径。

希望这能消除您的疑问。

.Net core 2.2 版本控制:我们在项目中使用了Microsoft.AspNetCore.Mvc.Versioning NuGet 包或GIT,它位于 .net core 2.2 中。需要在Setup.cs->ConfigureService方法文件中进行一些设置,然后您可以在控制器中使用,即 [Route("api/v{v:apiVersion}/[controller]")]

Setup.cs -> 配置服务

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