WCF数据服务(OData)与ASP.NET Web API

Ray*_*lli 87 rest wcf wcf-data-services odata asp.net-web-api

我正在设计一个分布式应用程序,它将包含RESTful服务和各种客户端(Silverlight,iOS,Windows Phone 7等).现在我正在确定应该使用哪种技术来实现我的服务,WCF数据服务(OData)或ASP.NET MVC 4推出的新ASP.NET Web API.

我在网上看了几个关于每个的演示文稿,现在我倾向于WCF数据服务,主要是因为URI内置的过滤机制和本机超媒体功能.我能看到的唯一缺点是Atom Pub规范的详细程度与POX相反.

在作出决定之前,我对这两项技术有什么了解吗?为什么有人会选择基于WCF数据服务的ASP.NET Web API?

小智 110

WebApi和WCF数据服务之间目前存在其他主要差异,似乎没有人提及过.我希望MS能够提供一篇比较两者的好文章.

我一直关注OData并且还关注WebApi.我总能找到一些重要的区别.

首先,我不确定你的老板是什么意思"MS支持WebApi",意思是他们不支持OData?IMO,他们支持两者,目前有一些最小的重叠.Windows Azure数据市场使用OData公开其数据,Azure表存储使用OData,SharePoint 2010允许OData查询数据,而MS的其他产品也支持它,例如Excel PowerPivot.对于关系数据,它是一个非常强大的Query框架.因为它是RESTful,所以任何语言,框架,设备等都可以与它集成.

以下是我喜欢的OData + WCF数据服务:

在通过Web查询数据时,OData + WCF数据服务最终允许客户端应用程序更具"表现力".在此之前,我们总是不得不使用ASMX或WCF来构建严格的Web API,这些API变得笨拙并且在UI需要稍微不同的时候需要不断更改.客户端应用程序只能指定参数来指定要返回的条件.或者像我一样做并"序列化"LINQ表达式并将它们作为参数传递并重新补充到Expressions<Func<T,bool>>服务器上.它体面.完成了工作,但我想在客户端上使用LINQ并使用REST在Web上进行翻译,这正是OData允许的,我不想使用我自己的"黑客"解决方案.

这就像暴露"TRANSACT SQL"而不需要DB连接字符串.只需提供一个网址和哇!开始查询.当然,WebApi和WCF数据服务都支持身份验证/授权,因此您可以控制访问权限,根据角色或其他数据配置附加额外的"Where"语句.我宁愿在我的Web Api层中而不是在SQL中(比如构建视图或存储过程).现在应用程序可以自己构建查询,您将看到Ad-Hoc和BI Reporting工具开始利用OData并允许用户定义自己的结果.不依赖静态报告,他们只有最小的控制权.

在Silverlight,Windows 8 Metro或ASP.NET(MVC,WebForms等)中进行开发时,您只需在Visual Studio中将"服务引用"添加到WCF数据服务,并快速开始使用LINQ查询数据并获得客户端上的"数据上下文",这意味着它跟踪更改并允许您以原子方式"提交"更改回服务器.这与RIA Services for Silverlight非常相似.我本来会使用WCF数据服务而不是RIA服务,但当时它不支持DataAnnotations或Actions,但现在确实如此:) WCF数据服务比RIA服务还有另一个优势,即能够执行"预测"来自客户.这可以帮助提高性能,因为我不想从实体返回所有属性.在处理业务线应用程序时,在客户端上拥有"数据上下文"非常棒.

因此,如果您有关系数据,WCF数据服务是很好的,特别是如果您使用的是SQL Server和实体框架.您可以使用非常少的代码快速地通过REST公开可查询数据+操作(调用调用操作,即工作流,后台进程).WCF数据服务刚刚更新.新版本发布.查看所有新功能.

WCF数据服务的缺点是您在HTTP堆栈上松散的"控制".我发现最大的缺陷是在IQueryable<T>返回集合的方法中.与RIA Services和WebApi不同,您没有完全访问权限来开发IQueryable方法中的逻辑.在RIA Services和WebApi中,只要您返回,您就可以编写任何您想要的代码IQueryable<T>.在WCF数据服务中,您只能使用Expression<Func<T,bool>>拦截器方法访问"Where"语句.我发现这令人失望.我们当前的应用程序使用RIA服务,我发现我们确实需要能够控制IQueryable逻辑.我希望我错了,我只是错过了一些东西

此外,WCF数据服务还不完全支持所有LINQ运算符.它仍然支持WebApi以外的功能.

WebApi怎么样?

  1. 我喜欢对Http请求/响应的控制
  2. 它很容易遵循(利用MVC模式).我相信会有更多的工具来.

截至目前(根据​​我的理解),客户端上没有"数据上下文"支持(即Silverlight,ASP.NET服务器端代码等),因为WebApi实际上并不是关于像WCF数据服务/ OData这样的实体数据模型是.它可以使用IQueryable/IEnumerable公开模型对象的集合,但是一旦在客户端上加载了实体,就没有主键/外键"导航属性"(即customer.Invoices),因为没有"数据上下文"它以异步方式加载它们(或使用$ expand在一次调用中),并管理更改.您在客户端上没有代码生成的"实体数据模型"表示,就像您在RIA服务或WCF数据服务中那样.我不是说你不能/不在客户端有代表你的数据的模型,但你已经手动填充数据并管理一旦检索到的每个"客户"将设置哪些"发票"网络.这可能会变得棘手,特别是所有Async的东西都在继续.你不知道哪个电话会先回来.这可能很难解释,但只是阅读RIA服务或WCF数据服务中的"数据上下文"内容.因此,在处理业务线应用时,这对我来说是个主要问题.这主要基于生产力和可维护性.您可以在没有数据上下文的情况下密集构建应用程序.它使事情变得更容易,特别是在Silverlight,WPF和现在的Windows 8 Metro中.将关系实体异步加载到内存中并具有双绑定非常好.

话虽如此,这是否意味着有一天WebApi可以支持客户端的"数据上下文"?我认为可以.此外,通过更多工具,Visual Studio项目可以基于数据库模式(或实体框架)生成所有CRUD方法.

此外,我知道在使用WCF数据服务或WebApi时我只提到.NET到.NET框架,但我非常清楚HTML/JS也是一个主要的参与者.我只是提到了在处理Silverlight UI或ASP.NET服务器端代码等时所发现的好处.我相信HTML5/JavaScript中"IndexedDB"的出现带有"数据上下文"和JavaScript中的LINQ框架也可以变得可用,使得从JavaScript更容易查询OData服务的能力(您今天可以使用DataJS和OData).另外,使用KnockoutJS支持MVVM和HTML/JS中的绑定,将使它变得轻而易举:)

我正在研究使用哪个平台.我很高兴使用其中任何一个,但我倾向于倾向于OData,因为我的下一个应用程序主要是关于Analytics(只读),我想要一个富有表现力的RESTful Api.我相信OData + WCF数据服务给了我这一点,因为WebApi只支持$ take,$ skip,$ filter,$ orderby.它不支持预测,包括($ expand)等.我没有很多"更新/删除/插入",我们的数据是相当关联的.

我希望其他人加入讨论并提出他们的想法.我仍在决定,并希望听到其他意见.我真的认为这两个框架都很棒.我想知道你是否还要选择,为什么不在需要的时候使用它们.从客户端来看,无论如何都要构建REST调用.只是一个想法 :)

  • 正如我们在2014年,微软有一篇有趣的博客文章http://blogs.msdn.com/b/odatateam/archive/2014/03/27/future-direction-of-wcf-data-services.aspx进行讨论来自WCF和WebApi的OData支持的未来. (5认同)
  • Web Api有一个OData支持的新预览,它增加了丢失的空间,并将它放在WCF DS使用的相同基础上:[link] [http://blogs.msdn.com/b/alexj/archive/2012/08/15 /odata-support-in-asp-net-web-api.aspx] (4认同)

jru*_*ell 31

这是一个主观问题,所以这是一个主观的答案.IMO,WCF对简单的RESTful服务有太多的开销.另一方面,Web API专为RESTful服务而设计.

我和Dave Ward达成了协议.查看他的博客了解更多信息.

我一直坚持要求在WebForms项目中从ASMX转移到WCF的压力,因为接受WCF的复杂性主要只是奖励我灵活性较低的JSON序列化.相比之下,我已经开始将我的一些项目从ASMX转换为Web API,并对Web API取代ASMX的方式感到满意.

我相信微软最终在ASMX的简单性和WCF与Web API的强大功能之间取得了很好的平衡.

  • 谢谢你的回答!我有一个后续问题,所以我希望你对ASP.NET Web API非常熟悉.我喜欢WCF数据服务的一件事是超媒体功能.使用他们的Netflix示例,您可以查询一类电影,开箱即用服务将返回该流派中每部电影的链接,而不是每部电影的整个条目.有没有办法用ASP.NET Web API做到这一点?看起来它为您提供了整个扩展的对象结构,而不是使用超媒体. (2认同)
  • 那是一种痛苦.我希望有一些配置来打开它.如果会自动发生.我的老板正在推动Web API,因为MS的所有权力都支持它.这一切似乎都会很好.它的有效载荷比OData更简洁,它具有OData的URI查询功能,它只是缺少开箱即用的超媒体.也许它会在发布时间找到它的方式. (2认同)

res*_*kiy 26

我们相信Web API为OData服务提供了正确的平台,因此将主要投资于该平台 的OData服务器堆栈.我们当然会继续将大量资源投入OData核心库和客户端,但我们计划将 WCF数据服务的投资减少为创建OData服务的堆栈.

OData团队博客

所以,现在看来一切都很清楚


Mic*_*ays 16

Web API和WCF数据服务都支持开箱即用的OData.使用WCF数据服务(WCFDS),它是自动的.使用Web API,IQueryable从控制器返回并使用标记方法[Queryable].这将为您提供$filter您正在谈论的功能.如果你这样做,两者都可以通过放入accept=application/json请求标头自动处理响应中的JSON .来自WCFDS的OData支持比Web API更多的OData关键字(尽管只考虑了$expand关键字),但我确信时间会解决这个问题.

.NET客户端和HTML页面都可以轻松调用这两种备选方案,但如果您喜欢LINQ,并且构建.NET客户端,则可以将WCFDS作为服务引用添加到项目中.这允许您完全跳过所有HTTP业务并直接查询集合.

最重要的是,没有什么可以阻止您将.svc文件放入ASP.Net MVC项目中.它不是一个或两个命题.向服务器添加数据服务将节省您编写大量控制器的需要,但如果您愿意,也不会阻止您编写其他控制器.


Sor*_*ren 6

换一种说法 :

如果您希望快速公开数据模型(EDM或其他方式)并且不需要大量代码或业务逻辑,那么WCF数据服务非常简单,并且是一个很好的起点.

如果您正在构建API并且只想使用OData查询语法或格式化来公开某些资源(和逻辑),那么ASP.NET Web API可能是最好的起点.

http://mattmilner.com/Milner/Blog/post/2013/04/02/WCF-Data-Services-and-Web-API-with-OData;-choices-choices.aspx


Chr*_*ton 5

Devaron对我尚未找到的WCF和Web Api进行了最丰富的回顾.谢谢.现在到了WCF过于复杂的地步,我会说复杂性不会自动消极.你将会感谢它将来为你提供的喘息空间.与Microsoft工具一样的挑战是我们不知道或控制未来.让我们希望微软最终得到一个更统一的系统,并且它可以保持几年.

我还有一个很大的系统来构建,它强调我的道路并不是更清晰.我打算暂缓几个月,而这一切都解决了.个人而言,我正在为datajs工作(也查看JayData)