【问题标题】:OData API versioning issue .net core 3.1OData API 版本控制问题 .net core 3.1
【发布时间】:2021-09-29 02:31:12
【问题描述】:

我收到与 OData API 版本控制相关的应用程序启动异常。 异常消息:

实体模型 (EDM) 没有所需的 ApiVersionAnnotation 注解

映射版本化odata路由的sn-p

 public static IEndpointRouteBuilder MapPaymentsODataRoute(this IEndpointRouteBuilder builder)
    {
        builder.MapVersionedODataRoute(
            "payments-odata",
            "api/v{apiVersion:apiVersion}/payment-service/odata",
            new List<IEdmModel> { BuildEdmModel() });
    
        return builder;
    }

在 DI 容器中注册的所有需要​​的 API 版本控制服务。

查看端点配置: endpoint configuration

查看控制器示例: controller example

有什么想法吗?有什么问题?

【问题讨论】:

    标签: .net odata aspnet-api-versioning


    【解决方案1】:

    尚不完全清楚BuildEdmModel() 的作用,但您似乎是手动构建它,而不是通过 VersionedODataModelBuilder。这是允许的,但要知道您需要设置 ApiVersionAnnotation。 OData 的 API 版本控制使用 每个 API 版本的 EDM 方法,这使所有内容都清晰隔离。 API 版本控制通过将应用的 ApiVersionAnnotation 与已解析的传入 API 版本进行比较来确定如何匹配 EDM。 “只能有一个。”

    如果您自己构建 EDM,则需要将此必需的注释添加到模型本身:

    edm.SetAnnotationValue(edm, new ApiVersionAnnotation(new ApiVersion(1, 0)));
    

    如果您只有一个版本,这很容易构建。如果您有多个版本,它会变得更加复杂。 VersionedODataModelBuilder 通过创建一组所有 API 版本的联合集来实现此目的,来自所有 OData API,通过 IActionDescriptorCollectionProvider 发现。对于每个发现的 OData API 版本,一组 IModelConfiguration 实例用于在特定 API 版本中应用该特定 EDM 的配置,不包括任何内容(例如,排除) .这是由实施者(例如开发者)决定的。根据应用程序的复杂性,您可以使用单个 IModelConfiguration、每个实体一个,或者根本不使用,只使用 VersionedODataModelBuilder.DefaultModelConfiguration 回调。

    无论您使用哪种方法,如果设置了 ApiVersionAnnotation,您将重新开始工作。


    更新:响应添加的图像。

    还有几点补充:

    • 如果您从 DI 注入 VersionedODataModelBuilder 或从 IServiceProvider 显式解析它,所有工作都已为您完成。
    • 如果您只是将 VersionedODataModelBuilder 作为参数传递给MapVersionedODataRoute,它会做正确的事情。由于 OData 的 前缀 概念,IModelConfiguration 可能因 API 版本路径而异。或者,您可以致电VersionedODataModelBuilder.GetEdmModels('path')。如果前缀之间没有区别,那就没问题了。
    • 主要问题似乎是您的控制器名称不匹配。 API 版本控制按控制器名称整理 API,因为 - 嗯 - 它是唯一可以使用的一致且可靠的东西。这对于匹配相应的 EDM 也很重要。目前还不清楚 PaymentsODataRouteAttribute 究竟做了什么;但是,如果它设置了 controller 路由参数,那么它应该工作。如果不是,那么您的控制器名称需要匹配,或者您可以使用提供的[ControllerName("payments")] 来满足要求。我假设对应实体集的名称是Payments
    • 不知道 EnableODataAttribute 是什么。这似乎不是标准属性。从 ODataController 继承将启用 OData 功能。
    • OData支持开箱即用的 API Explorer。如果您还没有使用 OData 的 API 版本控制 API Explorer 扩展,则配置 [ApiExplorerSettings(IgnoreApi = false)] 可能会在运行时导致错误。 API 版本控制扩展知道 ODataController 明确选择退出 API Explorer。默认情况下,它将完全忽略IgnoreApi 设置,这样您就不必重新配置和选择每个ODataController。如果你真的想使用 ApiExplorerSettingsAttribute,那么你可以配置 API Explorer 扩展以使用 ODataApiExplorerOptions.UseApiExplorerSettings,默认为 false。如果您不将其更改为 true,则该设置将被完全忽略,其中可能包括您有意标记为 IgnoreApi = true 的控制器。

    【讨论】:

    • 谢谢,克里斯。应用程序启动异常消失。但是控制器的操作返回 404 Not Found。定义了控制器和操作。
    • 这可能只是路由配置错误。你能分享更多吗?这么少的信息很难回答。下一个有趣的可能是你的控制器的骨架,包含动作、路由信息等。
    • 查看端点配置:prnt.sc/1tytpq9 查看控制器示例:prnt.sc/1tyui6l 我可以多次映射版本化的 odata 路由吗?
    • 不幸的是,这些链接没有显示任何内容。看起来他们指向要安装的某种类型的应用程序。 :S 如果您无法更新您的问题,也许是 Gist 帖子之类的? API 版本控制尽一切努力不改变有关路由的任何内容。目标只是通过 API 版本鉴别器消除路由的歧义,这在本质上是不可能开箱即用的。简而言之,是的 - 可以将多个路由和/或版本映射到单个操作。
    • 问题已更新图片。
    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2021-09-11
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多