【问题标题】:AspNetZero .NetCore + Angular project - api versioningAspNetZero .NetCore + Angular 项目 - api 版本控制
【发布时间】:2021-02-06 09:09:10
【问题描述】:

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

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

在我的应用程序项目中,我将当前 AppService 的命名空间更改为 .v1,并创建了一个具有命名空间 v2 的新 AppService,它继承了旧的 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

【问题讨论】:

    标签: asp.net-core aspnet-api-versioning aspnetzero


    【解决方案1】:
    1. YOURCOMPANY.Web.Host 项目中打开Startup.cs

    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. YOURCOMPANY.Web.Host 中打开appsettings.json 并在"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. 现在您可以通过在您的YOURCOMPANY.Application 项目中添加ApiExplorerSettings 属性来实现V2 组中的API;假设您有一个名为 (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-05-21
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2011-09-01
      • 2012-05-31
      • 2012-08-30
      • 2021-03-25
      相关资源
      最近更新 更多