Asp.net core AspNetZero.NetCore+;角度项目-api版本控制

Asp.net core AspNetZero.NetCore+;角度项目-api版本控制,asp.net-core,aspnet-api-versioning,aspnetzero,Asp.net Core,Aspnet Api Versioning,Aspnetzero,我有一个AspNetZero.NetCore+Angular项目,为了向后兼容,我需要对该项目实施api版本控制。我在网上介绍了几个示例,但它们要么没有指定所有步骤,要么是特定于mvc的,并且该项目使用AppService模式。如果有人成功地在AspNetZero项目中实现了api版本控制,我将非常感谢您的帮助 我目前在swagger页面上显示了两个版本,但是对于v1,我得到了一个含糊不清的MatchException,对于v2,swagger找不到v2文件,所以我假设它没有生成 在我的应用程序

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

我目前在swagger页面上显示了两个版本,但是对于v1,我得到了一个含糊不清的MatchException,对于v2,swagger找不到v2文件,所以我假设它没有生成

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

  • YOURCOMPANY.Web.Host
    project中打开
    Startup.cs

  • ConfigureServices
    方法中,向下滚动并找到
    services.addswagggen…

  • 实现以下代码:

        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();
    
    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"]);
                }); 
    
  • 实现以下代码:

        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();
    
    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"]);
                }); 
    
  • 现在,您可以通过在您的
    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)
            {
    
            }
        }
    }
    
    namespace CMS.TestNameSpace
    {
    [ApiExplorerSettings(GroupName=“v2”)]
    [路由(“api/[controller]/[action]”)
    公共类TestAppService:(您的)AppServiceBase,ITestAppService
    {
    [HttpGet]
    公共异步任务GetTest(TestDtoInput输入)
    {
    }
    }
    }
    
  • YOURCOMPANY.Web.Host
    project中打开
    Startup.cs

  • ConfigureServices
    方法中,向下滚动并找到
    services.addswagggen…

  • 实现以下代码:

        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();
    
    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"]);
                }); 
    
  • 实现以下代码:

        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();
    
    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"]);
                }); 
    
  • 现在,您可以通过在您的
    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)
            {
    
            }
        }
    }
    
    namespace CMS.TestNameSpace
    {
    [ApiExplorerSettings(GroupName=“v2”)]
    [路由(“api/[controller]/[action]”)
    公共类TestAppService:(您的)AppServiceBase,ITestAppService
    {
    [HttpGet]
    公共异步任务GetTest(TestDtoInput输入)
    {
    }
    }
    }