簡體   English   中英

為所有API Endpoints路由添加前綴“nameService”,通過swagger配置

[英]Add prefix "nameService" to all API Endpoints route, through swagger configuration

我有 API 版本控制 swagger

namespace AccountingService
{
    public class Startup
    {
        //public Startup(IConfiguration configuration, IHostEnvironment env, ILogger<Startup> logger) { }
 
        //public void ConfigureServices(IServiceCollection services) { }
 
        public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IApiVersionDescriptionProvider provider)
        {
            if (HostEnvironment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
           
            UserHelper.InitDependencies(serviceProvider.GetRequiredService<IUserDataService>());
            app.ConfigureCustomMiddleware(Configuration, _appSettings);
            app.UseHttpsRedirection();
 
            app.UseRouting();
 
            app.UseAuthentication();
            
            app.UseUserService();
 
            if (_appSettings.Swagger.Enabled)
            {
                app.UseSwagger();
                app.UseSwaggerUI(options =>
                {
                    foreach (var description in provider.ApiVersionDescriptions)
                    {
                        options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToLowerInvariant());
                        options.RoutePrefix = $"{_appSettings.ServiceName}/swagger";
                    }
                });
            }
            
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

還有一堆帶路由的controller里面controller的屬性是這樣寫的

    [ApiVersion("1.0")]
    [Route("/api/v{version:apiVersion}/[controller]")]
    [ApiController]
    public class AccountCardController : CommonController
    { 
       //CRUD methods
       //BLL methods
       //Utils methods
    }

一切似乎都很好,但我需要將服務本身的名稱添加到每個方法的路由中有一個解決方案,我必須為每個 controller 手動注冊,但這是錯誤的(我認為)和廢話

Api route expect這樣一開始到處加accounting-service就變成這樣了

accounting-service/api/v{version:apiVersion}/[controller]

但我確信這可以通過啟動文件中的設置以某種方式完成,我不知道 swagger 設置如此深入以找到它們,在谷歌中他們說通過 endpoints.MapControllerRoute() 方法來完成,但是這不是我需要的東西,它對我沒有幫助

Swagger幫不上忙。 它生成可用接口的文檔,但不能更改路由。 雖然您可以通過編寫SchemaProcessorDocumentProcessor通過 swagger 更改文檔,但這會產生無效的 URL,ASP 核心無法處理這些 URL。

要解決此問題,您必須更改每個 controller RouteAttribute上的 RouteAttribute 並應用所需的值。

[ApiVersion("1.0")]
// add desired value into route
[Route("accounting-service/api/v{version:apiVersion}/[controller]")]
[ApiController]
public class AccountCardController : CommonController
{ 
   //CRUD methods
   //BLL methods
   //Utils methods
}

這是 ASP.core 給出的可能性中最干凈的方法。 即使您有幾十個控制器需要更改,也只需不到一個小時的時間,如果您必須更改數百個控制器,您可以考慮在“查找和替換”中運行一個正則表達式以更新所有地方。

另一種方法是編寫您自己的中間件,在將傳入請求轉發到 ASP 路由之前重寫傳入請求,但恕我直言,在這種情況下這有點過分了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM