1

我有一个 AspNetZero .NetCore + Angular 项目,我需要对项目实施 api 版本控制以实现向后兼容性。我在网上看了几个例子,但是它们要么没有指定所有的步骤,要么是特定于 mvc 的,而且这个项目使用了 AppService 模式。如果有人成功地在 AspNetZero 项目中实现了 api 版本控制,我将非常感谢您的帮助。

我目前在显示两个版本的 swagger 页面上,但是对于 v1,我得到一个 AmbiguousMatchException 并且对于 v2 swagger 找不到 v2 文件,所以我认为它没有生成。

在我的应用程序项目中,我将当前 AppService 的命名空间更改为 .v1,并创建了一个具有命名空间 v2 的新 AppService,它继承了旧的,并覆盖了 1 个方法,即 v2。

目的是一旦完成即能够调用这两种方法:(http://localhost:9901/api/services/app/Equities/Get_Snapshot 或 http://localhost:9901/api/services/v1/Equities /Get_Snapshot) 和 http://localhost:9901/api/services/v2/Equities/Get_Snapshot

4

1 回答 1

0
  1. Startup.csYOURCOMPANY.Web.Host项目中打开。

  2. ConfigureServices方法中,向下滚动并找到services.AddSwaggerGen ...

  3. 实现以下代码:

        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new OpenApiInfo()
            {
                Title = "MY API",
                Version = "v1",
                Description = "Any description for your V1 APIs."
            });
    
            options.SwaggerDoc("public", new OpenApiInfo()
            {
                Title = "CMS API",
                Version = "v2",
                Description = "Any description for your V2 APIs."
            });
    
            options.DocInclusionPredicate((docName, apiDesc) =>
            {
                switch (docName)
                {
                    case "v1":
                        return true;
                    case "v2":
                        return apiDesc.GroupName == null || apiDesc.GroupName == "v2";
                    default:
                        return false;
                }
            });
    
            options.ParameterFilter<SwaggerEnumParameterFilter>();
            options.SchemaFilter<SwaggerEnumSchemaFilter>();
            options.OperationFilter<SwaggerOperationIdFilter>();
            options.OperationFilter<SwaggerOperationFilter>();
            options.CustomDefaultSchemaIdSelector();
        }).AddSwaggerGenNewtonsoftSupport();
    
  4. 接下来,在Configure方法中,向下滚动并找到app.UseSwaggerUI ...

  5. 打开并appsettings.json在字段中YOURCOMPANY.Web.Host添加一个新的端点配置变量"App"


"SwaggerEndPoint": "/swagger/v1/swagger.json",
"SwaggerV2EndPoint": "/swagger/v2/swagger.json"
  1. 实现以下代码:

    app.UseSwaggerUI(options =>
                {
                    options.SwaggerEndpoint(_appConfiguration["App:SwaggerEndPoint"], "MY API V1");
                    options.SwaggerEndpoint(_appConfiguration["App:SwaggerPublicEndPoint"], "MY API V2");
    
                    options.IndexStream = () => Assembly.GetExecutingAssembly()
                        .GetManifestResourceStream("YOURCOMPANY.Web.wwwroot.swagger.ui.index.html");
                    options.InjectBaseUrl(_appConfiguration["App:ServerRootAddress"]);
                }); 
    
  2. V2现在您可以通过在项目中添加ApiExplorerSettings属性来分组实现 API YOURCOMPANY.Application;假设您有一个名为 (TestAppService) 的服务,

然后在下面的命名空间中实现你的方法(API),然后打开你的 Swagger UI 并测试它。

namespace CMS.TestNameSpace
{
    [ApiExplorerSettings(GroupName = "v2")]
    [Route("api/[controller]/[action]")]
    public class TestAppService : (YOUR)AppServiceBase, ITestAppService
    {
        [HttpGet]
        public async Task<TestDto> GetTest(TestDtoInput input)
        {

        }
    }
}
于 2021-03-12T03:36:02.963 回答