1

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

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

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

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

4

2 回答 2

1

我无法访问ImplementedApiVersions财产。我不得不想出一个解决方法。我创建了一个带有静态字段 ( ) 的服务(称为 ApiVersionService List<string> ApiVersions)。服务允许注册和读取注册版本。当我使用 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);
    }
于 2020-02-14T20:13:44.477 回答
0

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

如果您只想在请求中报告此信息,这是内置的;你只需要打开它。

options.ReportApiVersions = true;

这将返回api-supported-versionsapi-deprecated-versions标头。您可以在版本发现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接口不支持grouping的概念。如果你纯粹依赖界面,你会得到一个扁平化的列表。这取决于您引用 API Explorer 实现的位置。如果您稍后在应用程序中请求 API Explorer,您要么必须在原始IApiExplorer接口的范围内工作,要么转换为VersionedApiExplorerAddVersionedApiExplorer扩展方法总是返回一个VersionedApiExplorer。您还可以强制创建和/或扩展VersionedApiExplorer,而不是使用提供的扩展或configuration.Services.GetApiExplorer().

您可以在此处查看集成示例。但是,如果您真的想看看它是如何使用的并且您不熟悉IApiExplorer,那么您可能需要查看Swashbuckle之类的存储库。

我希望这会有所帮助。随时提出更多问题。

于 2019-06-29T00:28:41.187 回答