asp.net-core - AspNetZero .NetCore + Angular 项目 - api 版本控制
问题描述
我有一个 AspNetZero .NetCore + Angular 项目,我需要对项目实施 api 版本控制以实现向后兼容性。我在网上看了几个例子,但是它们要么没有指定所有的步骤,要么是特定于 mvc 的,而且这个项目使用了 AppService 模式。如果有人成功地在 AspNetZero 项目中实现了 api 版本控制,我将非常感谢您的帮助。
我目前在显示两个版本的 swagger 页面上,但是对于 v1,我得到一个 AmbiguousMatchException 并且对于 v2 swagger 找不到 v2 文件,所以我认为它没有生成。
在我的应用程序项目中,我将当前 AppService 的命名空间更改为 .v1,并创建了一个具有命名空间 v2 的新 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
解决方案
Startup.cs
在YOURCOMPANY.Web.Host
项目中打开。在
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 ...
打开并
appsettings.json
在字段中YOURCOMPANY.Web.Host
添加一个新的端点配置变量"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"]); });
V2
现在您可以通过在项目中添加ApiExplorerSettings
属性来分组实现 APIYOURCOMPANY.Application
;假设您有一个名为 (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)
{
}
}
}