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

时间:2015-11-05 16:08:08

标签: asp.net asp.net-mvc-4 asp.net-web-api2 restful-architecture

我对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作为资源来实现这一目标。

感谢您的回答。

1 个答案:

答案 0 :(得分:4)

对于初学者,可能不希望OrderHistories中的PUT和DELETE操作。能够改变/删除历史通常不是一个好主意。 (您可能甚至不希望对该资源执行POST操作。服务器端逻辑应在创建/修改/删除OrderHistory时创建自己的Order对象。)

除此之外......

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

基本上,您在此处要做的是向Orders资源发出POST以创建Order对象。此操作中的服务器端逻辑将在同一工作单元内,在OrderHistories中创建任何必要的相应记录。

根据您从这些资源中选择的方式,您将从查询它们所需的POST操作返回信息。例如,您不太可能希望立即通过自己的标识符查询OrderHistory,您可能需要通过Order ID进行查询。因此,在创建Order对象时,客户端可以使用返回的服务器生成的ID来查询OrderHistories是否需要。

最终,这听起来像混淆是因为RESTful服务基本上是对数据库表的一组传递操作。事实并非如此。消费客户端不应负责维护事务完整性或关系完整性。服务器端操作维护着这一点。