【问题标题】:OData v4 Changeset behaviourOData v4 变更集行为
【发布时间】:2015-10-27 07:05:12
【问题描述】:

我正在使用 WebApi 实现 OData v4 服务,并且我还使用来自 https://damienbod.wordpress.com/2014/08/14/web-api-odata-v4-batching-part-10/ 的代码实现了对 OData 变更集的支持

基本上这是可行的,但现在我想知道从一个变更集中的多个请求修改同一实体时的正确行为。 考虑这个例子:

内容 ID:1 - POST ~/Entity
-> 创建新实体。

内容 ID:2 - PUT ~/Entity($Entity-ContentID1)/Company/$ref?$id=URI
-> 使用 ContentID 创建从新实体到现有公司的链接。

内容 ID:3 - POST ~/Entity($Entity-ContentID1)/ChangeState
-> 执行操作以更改新创建的实体的状态。

只有在连接了公司的情况下才能执行 ChangetState。如果客户端按此顺序发送所有请求,并且我按顺序执行请求,则一切正常。
但根据OData Spec,变更集中的请求是无序的

如果客户端在请求 2 之前发送请求 3,预期的结果是什么?在我当前的实现中,这个变更集将失败,但这真的可以吗? 我很难理解变更集的正确语义......

【问题讨论】:

    标签: c# asp.net-web-api odata


    【解决方案1】:

    批处理请求作为单个 HTTP POST 请求提交到服务的批处理端点,变更集中的这些请求应发送到服务并按原始顺序进行。

    我认为,规范的意思是:Changeset中的请求将被无序处理,在我们的实验室中,我们以原始顺序处理,但不同的服务可以使用不同的顺序,您担心的不是必需的,客户不应该期望对于像您的场景这样的变更集的相同结果,否则他们应该放入不同的变更集,那么结果应该是相同的。

    【讨论】:

    • 我自己的客户按预期顺序发送请求。但规范并不要求这样做。以相反的顺序发送请求 1 和 2 例如没问题(理论上):请求 2 对 1 的依赖很明显,服务可以重新排序它们。但是对于请求 2 和 3,这是不可能的。我只是不确定,为什么规范不需要有序请求。我知道stackoverflow 的答案,但我仍然不确定。 SAP 人员,例如好像支持unordered changesets
    • 目前您可以自定义批处理处理程序以在处理这些请求时发生错误时回滚或停止。
    • 一旦发生错误,我已经回滚了变更集。我的问题:序列 1,2,3 是正确的,但是 1,3,2 导致错误。我认为根据规范,这种行为是不正确的,因为请求的顺序无关紧要
    • 我觉得你的服务行为是对的,在客户端我们可以设置reqeust 1, 2 content-id = 1, and reqeust 3 content-id=2
    • 根据规范,content-id 必须是唯一的,并且可能包含字母和数字,因此无法按 content-id 排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多