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

AspNetZero .NetCore + Angular project - api versioning

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

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

在我的应用程序项目中,我将当前 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. 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)
        {

        }
    }
}