0

请考虑以下情况。

因为版本 1.0 未在 ApiVersionAttribute 中的控制器上定义,所以未发现未声明 API 版本。就像我想要的那样,因为从这一刻起我不想再支持这个版本了。我依赖 IApiVersionDescriptionProvider 的招摇文档工作正常,不再为 version1 生成文档。当我对 2.1 版进行 api 调用并检查返回的版本标头时,也只有受支持的 2.1 版和已弃用的 2.0 版。和预想的一样。

但是当我调用1.0 版本时,我仍然到达端点,并且 apiversion 仍然没有返回 1.0 作为受支持的版本。我希望这会返回一个带有“UnsupportedApiVersion”错误消息的 400 错误请求以及描述版本 2.0 和 2.1 的标头。

我探索这种行为的原因是我们希望通过在运行时通过一些配置为某个版本添加 ApiVersionAttribute 来升级我们的微服务版本。所以我们不需要进行新的构建,因为 Getdefault 路由将为那些更高的 apiversions 映射。

//  Declare both versions
[ApiVersion("2.0", Deprecated = true)]
[ApiVersion("2.1")]
[Route("v{version:apiVersion}/HelloWorld")] // Support path versioning
[ApiController]
public class HelloWorldController : ControllerBase
{

    //  Map to v1.0
    [MapToApiVersion("1.0")]
    public string Get1() => "v1.0";

    //  Map to v2.0
    [MapToApiVersion("2.0")]
    public string Get2() => "v2.0";

    //  Map to all versions defined on the controller that not already have a mapping
    public string Getdefault() => $"{forExamplePerposeHereIsVersionReturned}";
}

(包使用 Microsoft.AspNetCore.Mvc.Versioning)

感谢您的任何意见!

4

1 回答 1

0

发生这种情况是因为路径仍然存在,v1.0/HelloWorld并且Get1映射到此版本。API 版本控制不会更改路由,它仅允许通过 API 版本元数据匹配和消除重复路由。虽然1.0不再声明,但仍然存在有效路由并映射到相应版本的事实导致匹配。

当此 API/动作不再有效时,删除该 API/动作的正确方法是删除该动作(例如代码)。这是默认的期望。

有几种方法可以使事物看起来是动态的。您可以使用自定义约定仅基于某种配置声明和/或映射 API 版本。这可以通过 API Versioning Conventions API 来完成,或者您可以添加自己的自定义约定。另一种方法是注册一个最后运行的自定义IActionDescriptorProvider,并通过检查其关联的版本信息来删除不再适用的 API的ActionDescriptor 。通过扩展方法获取ApiVersionModel来检索此信息。ActionDescriptor.GetApiVersionModel

于 2021-03-19T14:36:29.423 回答