Asp.net restful 网络服务,在同一事务中对多个资源进行操作

Asp.net restful web service, operation on more than one resource in the same transaction

我对Asp.net restful web服务的理解是,对于每个资源,都有相应的get,post,delete,put动词。

但是如果我必须向需要操作多个资源的服务器提交请求怎么办? 例如,对于提交表单,我必须要求服务器创建一个 order 并在同一个请求中创建一个新的 order history。 对我来说,我将 orderan order history 定义为两种不同的资源。 而如果我们按照 ASP.NET MVC Web api restful web 服务,我们将创建两个控制器,一个名为 OrderController,另一个名为 OrderHistoryController。 每个控制器都有“get,post,delete,put”动词。

问题是我们如何确保订单的创建和订单历史的创建在一个事务中? 在创建订单后如何以及何时调用 OrderHistoryController 的 post 方法来创建 OrderHistory?

我目前不确定如何使用 OrderHistory 作为资源来实现这一点。

感谢您的回答。

首先,您可能 不希望在 OrderHistories 中执行 PUT 和 DELETE 操作。能够 change/delete 历史通常不是一个好主意。 (您可能甚至不想对该资源进行 POST 操作。服务器端逻辑应该在任何时候 Order 为 created/modified/deleted 时创建自己的 OrderHistory 对象。)

除此之外...

您不维护跨多个 HTTP 请求的事务(或更一般地说,工作单元)。每个请求本身都是一个孤立的原子工作单元。

所以基本上您在这里要做的是向 Orders 资源发出 POST 以创建一个 Order 对象。此操作中的服务器端逻辑将在同一工作单元内在 OrderHistories.

中创建任何必要的对应记录

根据您从这些资源中 select 的方式,您需要 return 来自 POST 操作的信息来查询它们。例如,您不太可能想立即通过其自己的标识符查询 OrderHistory,您可能会通过 Order ID 进行查询。因此,在创建 Order 对象时,客户端可以根据需要使用 returned 服务器为该对象生成的 ID 来查询 OrderHistories


最后,听起来这里的混乱来自错误的观念,即 RESTful 服务基本上是一组传递到数据库表的操作。它不是。消费客户端不应该负责维护事务完整性或关系完整性。服务器端操作保持这一点。