当前,WebApi和WCF数据服务之间还有其他主要区别,似乎从未有人提及。我希望MS能够发表一篇很好的文章来比较两者。
我一直在关注OData和WebApi。我总是发现一些主要区别。
首先,我不确定您的老板所说的“ MS支持WebApi”是什么意思,也就是说他们不支持OData?海事组织,他们都支持,目前有一些最小的重叠。Windows Azure数据市场使用OData公开其数据,Azure表存储使用OData,SharePoint 2010允许对其数据进行OData查询,MS的其他产品(例如Excel PowerPivot)也支持该数据。当涉及到关系数据时,它是一个非常强大的查询框架。而且由于它是RESTful,所以任何语言,框架,设备等都可以与其集成。
这是我喜欢的OData + WCF数据服务:
OData + WCF数据服务最终使客户端应用程序在通过Web查询数据时更具“表现力”。以前,我们总是必须使用ASMX或WCF来构建严格的Web API,这些API变得笨拙,并且每当UI需要稍微不同的东西时都需要不断进行更改。客户端应用程序只能指定参数来指示要返回的条件。或像我一样做并“序列化” LINQ表达式,然后将它们作为参数传递并重新水化为Expressions<Func<T,bool>>
服务器上。其体面。完成了工作,但是我想在客户端上使用LINQ,并使用REST在Web上将其转换,这正是OData所允许的,并且我不想使用自己的解决方案“ hack”。
就像无需数据库连接字符串就公开“ TRANSACT SQL”一样。只需提供一个网址和哇!开始查询。当然,WebApi和WCF数据服务都支持身份验证/授权,因此您可以控制访问,根据角色或其他数据配置附加其他“哪里”语句。我宁愿在Web Api层中执行此操作,也不愿在SQL中执行此操作(例如构建视图或存储的Procs)。现在,应用程序可以自行构建查询,您将看到Ad-Hoc和BI报表工具开始利用OData并允许用户定义自己的结果。不依赖于对其控制程度最低的静态报告。
在Silverlight,Windows 8 Metro或ASP.NET(MVC,WebForms等)中进行开发时,您只需在Visual Studio中向WCF数据服务中添加一个“服务引用”,然后快速开始使用LINQ来查询数据并获得一个客户端上的“数据上下文”,这意味着它跟踪更改,并允许您将更改原子地“提交”回服务器。这与RIA Services for Silverlight非常相似。我本可以使用WCF数据服务而不是RIA服务,但是当时它不支持DataAnnotations或Action,但是现在可以了:) WCF数据服务相对于RIA Services具有另一个优势,即执行“投影”的能力来自客户。如果我不想从实体返回所有属性,这可以提高性能。具有“数据上下文”
因此,如果您具有具有关系的数据,则WCF数据服务非常有用,尤其是在使用SQL Server和实体框架的情况下。您只需很少的代码,就可以通过REST快速公开可查询的数据+操作(调用调用操作,即工作流,后台进程)。WCF数据服务刚刚更新。新版本发布。查看所有新功能。
WCF数据服务的缺点是您无法通过HTTP堆栈进行“控制”。我发现最大的缺陷IQueryable<T>
在于返回Collections 的方法。与RIA Services和WebApi不同,您没有完全访问权限来开发IQueryable方法中的逻辑。在RIA Services和WebApi中,只要返回就可以编写所需的任何代码IQueryable<T>
。在WCF数据服务中,您只能使用以下内容来附加“ Where”语句Expression<Func<T,bool>>
拦截器方法。我发现这令人失望。我们当前的应用程序使用RIA Services,我发现我们确实需要控制IQueryable逻辑的能力。我希望我错了,我只是想念一些东西
另外,WCF数据服务也不能完全支持所有LINQ运算符。它仍然比WebApi支持更多。
WebApi呢?
- 我喜欢对Http Request / Response的控制
- 易于遵循(利用MVC模式)。我相信还会有更多的工具。
到目前为止(据我了解),客户端(例如Silverlight,ASP.NET服务器端代码等)尚不支持“数据上下文”,因为WebApi并不真正涉及WCF数据服务/ OData等实体数据模型是。它可以使用IQueryable / IEnumerable公开模型对象的集合,但是一旦实体加载到客户端上,就没有主键/外键“导航属性”(即customer.Invoices)可以使用,因为没有“数据上下文”异步加载它们(或使用$ expand在一个调用中),并管理更改。您没有像在RIA Services或WCF Data Services中一样,在客户端上没有代码生成的实体数据模型的“表示形式”。我并不是说您不能/没有代表您数据的客户端模型,但是您已经手动填充了数据,并管理了通过Web检索到每个“客户”后将要设置的“发票”。这可能会变得棘手,特别是在所有异步事件发生的情况下。您不知道哪些电话会先返回。这在这里可能很难解释,但是只需阅读RIA Services中的“数据上下文”内容或WCF数据服务。因此,在处理Line of Business Apps时,这对我来说是主要问题。这主要基于生产率和可维护性。您可以完全构建没有数据上下文的应用程序。它使事情变得更加容易,特别是在Silverlight,WPF和现在的Windows 8 Metro中。将关系实体异步加载到内存中并具有Two-Binding非常好。
话虽如此,这是否意味着有一天WebApi可以在客户端上支持“数据上下文”?我认为可以。此外,借助更多工具,Visual Studio项目可以基于数据库架构(或实体框架)生成所有CRUD方法。
另外,我知道在使用WCF数据服务或WebApi时,我只是在.NET框架中提到.NET,但是我很清楚HTML / JS也是主要参与者。我刚才提到的是在处理Silverlight UI或ASP.NET Server-Side Code等时发现的好处。随着HTML5 / JavaScript中“ IndexedDB”的出现,我相信具有“数据上下文”和也可以使用JavaScript中的LINQ框架,从而使从JavaScript查询OData服务的功能更加容易(您现在可以将DataJS与OData一起使用)。另外,使用KnockoutJS也支持MVVM和HTML / JS中的绑定,将使它轻而易举:)
我目前正在研究要使用的平台。我很乐意使用这两种方法,但是由于我的下一个应用程序主要是关于Analytics(分析)(只读),并且我想要一个功能丰富的RESTful Api,因此我倾向于使用OData。我相信OData + WCF数据服务给了我,因为WebApi仅支持$ take,$ skip,$ filter,$ orderby over Collections。它不支持投影,包含($ expand)等。我没有很多“更新/删除/插入”,并且我们的数据是相当相关的。
我希望其他人也能参与讨论并发表想法。我仍在决定,很想听听其他意见。我真的认为这两个框架都很棒。我想知道您是否必须选择,如果需要,为什么不使用两者。无论如何,从客户端开始都是建立REST调用。只是一个想法 :)