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
在 YOURCOMPANY.Web.Host
项目中打开 Startup.cs
。
在ConfigureServices
方法中,向下滚动找到services.AddSwaggerGen ...
执行以下代码:
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();
接下来,在Configure
方法中,向下滚动并找到app.UseSwaggerUI ...
在YOURCOMPANY.Web.Host
中打开appsettings.json
,在"App"
字段中添加一个新的端点配置变量:
"SwaggerEndPoint": "/swagger/v1/swagger.json",
"SwaggerV2EndPoint": "/swagger/v2/swagger.json"
执行以下代码:
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)
{
}
}
}
我有一个 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
在
YOURCOMPANY.Web.Host
项目中打开Startup.cs
。在
ConfigureServices
方法中,向下滚动找到services.AddSwaggerGen ...
执行以下代码:
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();
接下来,在
Configure
方法中,向下滚动并找到app.UseSwaggerUI ...
在
YOURCOMPANY.Web.Host
中打开appsettings.json
,在"App"
字段中添加一个新的端点配置变量:
"SwaggerEndPoint": "/swagger/v1/swagger.json",
"SwaggerV2EndPoint": "/swagger/v2/swagger.json"
执行以下代码:
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)
{
}
}
}