Asp.net core AspNetZero.NetCore+;角度项目-api版本控制
我有一个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_SnapshotAsp.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文件,所以我假设它没有生成 在我的应用程序
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)的服务
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)的服务
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输入)
{
}
}
}