AspNetZero .NetCore + Angular项目-API版本控制

问题描述

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

我目前正在显示两个版本的swagger页面,但是对于v1,我收到了AmbiguousMatchException,而对于v2,swagger无法找到v2文件,因此我认为它没有生成

在我的Application项目中,我将当前AppService的命名空间更改为.v1,并创建了一个新的带有命名空间v2的AppService,该命名空间继承了旧的命名空间,并覆盖了将成为v2的1个方法

目标是一旦完成即能够调用这两种方法: (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

解决方法

  1. Startup.cs 项目中打开 YOURCOMPANY.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 属性来实现 YOURCOMPANY.Application 组中的 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)
        {

        }
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...