问题描述
我有一个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
解决方法
-
在
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
属性来实现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)
{
}
}
}