什么造成了DbDataProvider不符合RESTful标准?

3

我听到一些人评论说,新的ASP.NET WebAPI中Entity Framework数据的默认控制器/提供程序(DbDataController)严格来说不是REST风格的服务,而更像是RPC风格的服务。我理解WebAPI框架允许你创建任何类型的HTTP服务,包括REST风格和其他风格,但能否有人具体解释一下DbDataController暴露的服务中哪些方面使其不是真正的REST服务呢?

1个回答

4
REST体系结构风格描述了以下六个约束条件,应用于架构,同时使各个组件的实现自由设计:
客户端-服务器:一个统一的接口将客户端与服务器分离。这种关注点的分离意味着,例如,客户端不关心数据存储,数据存储仍然是每个服务器的内部事务,因此客户端代码的可移植性得到了改善。服务器不关心用户界面或用户状态,因此服务器可以更简单、更可扩展。只要它们之间的接口没有被改变,服务器和客户端也可以被替换和独立开发。
无状态:客户端-服务器通信进一步受到没有客户端上下文存储在请求之间的服务器的限制。来自任何客户端的每个请求都包含服务请求所需的所有信息,并且任何会话状态都保存在客户端中。服务器可以具有状态;这个约束只要求服务器端状态可以通过URL作为资源寻址。这不仅使服务器更易于监视,而且在部分网络故障的情况下也使它们更加可靠,并进一步增强了它们的可扩展性。
可缓存:与万维网上一样,客户端可以缓存响应。因此,响应必须隐式或显式地定义自己是否可缓存,以防止客户端在响应进一步请求时重复使用过时或不适当的数据。良好管理的缓存部分或完全消除了一些客户端-服务器交互,进一步提高了可扩展性和性能。
分层系统:客户端通常无法确定它是直接连接到终端服务器还是连接到中间代理。中介服务器可以通过启用负载平衡和提供共享缓存来提高系统的可扩展性。它们也可以强制执行安全策略。
按需代码(可选):服务器能够通过传输可执行代码临时扩展或定制客户端的功能。这些示例可能包括编译组件,如Java小程序和客户端脚本,如JavaScript。
统一接口:客户端和服务器之间的统一接口简化和解耦了架构,使每个部分都能独立演变。该接口的四个指导原则如下所述。
“REST架构的唯一可选约束是代码按需。如果一个服务违反任何其他约束,它就不能被严格认为是RESTful的。DbDataController类将Entity Framework模型暴露为HTTP服务。这些服务与WCF数据服务具有很大的特性重叠,例如CRUD支持、元数据和请求批处理。它们甚至部分模仿了OData的查询字符串格式。但是这些服务遵循RPC风格,是不符合REST原则的,也没有使用OData。”这是来自WCF Data Services and ASP.NET Web API 网站的一段引用。

虽然这个答案有帮助,但它并没有指出DbDataController违反了哪个约束条件,或者具体为什么违反了该约束条件。此外,是什么使它成为RPC风格的服务? - Jeremy Bell
1
RPC由客户端发起,客户端向已知的远程服务器发送请求消息以执行指定的带有提供参数的过程。远程服务器向客户端发送响应,应用程序继续其过程,就像DBDataControl提供了一种快速高效的方式来检索和编辑任何关系数据库中的数据。因此,我们可以说它类似于RPC风格的服务。 - G Gr
1
根据这个定义,如果服务器端使用相应的过程调用实现每种REST请求,那么所有REST服务也可以被称为RPC服务。您认为“纯”REST API与DbDataController所做的有任何实质性差异,还是我没有完全理解这个RPC概念? - Jeremy Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接