如何检索我的 api 的所有已实现版本的列表?

问题描述 投票:0回答:3

我在我的 WebApi 项目中使用 aspnet-api-versioning,它工作正常。版本不是硬编码的,它们是从命名空间中检索的。

现在我想检索已实施版本的列表。我想创建一些端点(我们称之为 GetApiVersions),用户可以调用它来检索现有 api 版本号的简单集合,例如[1,2,3].

在负责根据检索到的请求选择正确的 api 版本的代码(

CurrentImplementationApiVersionSelector
SelectVersion
方法)中,有一个带有
ApiVersionModel
属性的
ImplementedApiVersions
参数。

ImplementedApiVersions
属性似乎正是我所需要的,但我不知道如何在我的GetApiVersions端点中访问它。有办法找回吗?或者有没有其他方法可以以编程方式检索已实现的 api 版本列表?

asp.net-web-api asp.net-web-api2 api-versioning aspnet-api-versioning
3个回答
1
投票

我无法访问

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);
    }

0
投票

@Marta 你的目标是什么?获得 API 版本后,您希望如何处理它们?这将决定解决方案。

如果您只想在请求中报告此信息,这是内置的;您只需将其打开即可。

options.ReportApiVersions = true;

这将返回 api-supported-versionsapi-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 之类的存储库。

我希望有帮助。欢迎提出更多问题。


0
投票

使用可以使用以下界面

Microsoft.AspNetCore.Mvc.ApiExplorer.IApiVersionDescriptionProvider
并访问
ApiVersionDescriptions

有所有已实施版本的列表!

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.