我在我的 WebApi 项目中使用 aspnet-api-versioning,它工作正常。版本不是硬编码的,它们是从命名空间中检索的。
现在我想检索已实施版本的列表。我想创建一些端点(我们称之为 GetApiVersions),用户可以调用它来检索现有 api 版本号的简单集合,例如[1,2,3].
在负责根据检索到的请求选择正确的 api 版本的代码(
CurrentImplementationApiVersionSelector
、SelectVersion
方法)中,有一个带有 ApiVersionModel
属性的 ImplementedApiVersions
参数。
ImplementedApiVersions
属性似乎正是我所需要的,但我不知道如何在我的GetApiVersions端点中访问它。有办法找回吗?或者有没有其他方法可以以编程方式检索已实现的 api 版本列表?
我无法访问
ImplementedApiVersions
财产。我必须想出一个解决方法。我创建了一个带有静态字段 (List<string> ApiVersions
) 的服务(称为 ApiVersionService)。服务允许注册和读取注册版本。由于我使用的是 swagger,因此我在 SwaggerConfig.cs
文件中注册了所有版本:
configuration.EnableSwagger(ApiDocConfiguration.RouteTemplate, swagger =>
{
swagger.MultipleApiVersions(
(apiDescription, version) => apiDescription.GetGroupName() == version,
info =>
{
foreach (var group in apiExplorer.ApiDescriptions)
{
apiVersionService.AddApiVersion(group.Name);
// some other code
}
});
});
简单的端点允许我检索所有版本:
[HttpGet]
[Route("versions")]
public IHttpActionResult GetVersions()
{
// apiVersionService returns the data stored in ApiVersions field
var versions = apiVersionService.GetApiVersions();
return Ok(versions);
}
@Marta 你的目标是什么?获得 API 版本后,您希望如何处理它们?这将决定解决方案。
如果您只想在请求中报告此信息,这是内置的;您只需将其打开即可。
options.ReportApiVersions = true;
这将返回 api-supported-versions 和 api-deprecated-versions 标头。您可以在 Version Discovery wiki 主题中查看此内容以及更多信息。
您还可以在控制器中当前执行的操作上使用 GetApiVersionModel 扩展方法。再次强调 - 根据您在管道中的时间和位置决定您检索信息的方式。
对于文档类型场景,您还需要 API Versioning API Explorer 包。这将为 Web API 提供一个IApiExplorer实现,它将按 API 版本整理所有 API 和路由。您可以根据需要重新排序。这与 Swagger/OpenAPI 生成器用来构建文档的方法/技术相同。您可以通过以下方式将其集成到您的应用程序中:
var apiExplorer = configuration.AddVersionedApiExplorer(options => { });
// TODO: use the API Explorer
具体如何使用 API Explorer 由您决定。请注意,内置的 IApiExplorer 界面不支持 分组 的概念。如果您纯粹依赖于界面,您将得到一个扁平列表。这很重要,具体取决于您引用 API Explorer 实现的位置。如果您稍后在应用程序中请求 API Explorer,则必须在原始 IApiExplorer 接口的范围内工作,或者转换为 VersionedApiExplorer。
AddVersionedApiExplorer
扩展方法始终返回一个VersionedApiExplorer。您还可以强制创建和/或扩展 VersionedApiExplorer,而不是使用提供的扩展或 configuration.Services.GetApiExplorer()
。
您可以在此处查看集成示例。但是,如果您确实想了解它的使用方式并且不熟悉 IApiExplorer,那么您可能想查看诸如 Swashbuckle 之类的存储库。
我希望有帮助。欢迎提出更多问题。
使用可以使用以下界面
Microsoft.AspNetCore.Mvc.ApiExplorer.IApiVersionDescriptionProvider
并访问ApiVersionDescriptions
有所有已实施版本的列表!