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

How to retrieve list of all implemented versions of my api?

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

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

在负责根据检索到的请求(CurrentImplementationApiVersionSelectorSelectVersion 方法)选择正确 api 版本的代码中,有一个 ApiVersionModel 参数带有ImplementedApiVersions属性。

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

@Marta 你的目标是什么?有了 API 版本后,您希望用它们做什么?这将决定解决方案。

如果您只想在请求中报告此信息,这就是 built-in;你只需要打开它。

options.ReportApiVersions = true;

这将 return api-supported-versionsapi-deprecated-versions headers。您可以在 Version Discovery wiki 主题中查看此内容和更多信息。

您还可以对控制器中当前正在执行的操作使用 GetApiVersionModel 扩展方法。同样 - 根据您在管道中的时间和位置确定您检索信息的方式。

对于文档类型的场景,您还需要 API Versioning API Explorer 包。这将为 Web API 提供 IApiExplorer 实现,它将按 API 版本整理所有 APIs 和路由。您可以根据需要重新排序。这与 Swagger/OpenAPI 生成器用来构建文档的 approach/technique 相同。您可以通过以下方式将其集成到您的应用程序中:

var apiExplorer = configuration.AddVersionedApiExplorer(options => { });

// TODO: use the API Explorer

具体如何使用 API 资源管理器由您决定。请注意 built-in IApiExplorer 接口不支持 grouping 的概念。如果你纯粹依赖界面,你会得到一个扁平化的列表。这取决于您引用 API Explorer 实现的位置。如果稍后在您的应用程序中请求 API 资源管理器,您要么必须在原始 IApiExplorer 界面的范围内工作,要么转换为 VersionedApiExplorerAddVersionedApiExplorer 扩展方法总是 return 是一个 VersionedApiExplorer。您还可以强制创建 and/or 扩展 VersionedApiExplorer 而不是使用提供的扩展或 configuration.Services.GetApiExplorer().

您可以查看集成示例 here. However, if you really want to see how it's used and you're not familiar with IApiExplorer, then you probably want to look at a repo such as Swashbuckle

希望对您有所帮助。欢迎提出更多问题。

我无法访问 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);
    }