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怎么样?
截至目前(根据我的理解),客户端上没有"数据上下文"支持(即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调用.只是一个想法 :)
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的强大功能之间取得了很好的平衡.
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项目中.它不是一个或两个命题.向服务器添加数据服务将节省您编写大量控制器的需要,但如果您愿意,也不会阻止您编写其他控制器.
换一种说法 :
如果您希望快速公开数据模型(EDM或其他方式)并且不需要大量代码或业务逻辑,那么WCF数据服务非常简单,并且是一个很好的起点.
如果您正在构建API并且只想使用OData查询语法或格式化来公开某些资源(和逻辑),那么ASP.NET Web API可能是最好的起点.
Devaron对我尚未找到的WCF和Web Api进行了最丰富的回顾.谢谢.现在到了WCF过于复杂的地步,我会说复杂性不会自动消极.你将会感谢它将来为你提供的喘息空间.与Microsoft工具一样的挑战是我们不知道或控制未来.让我们希望微软最终得到一个更统一的系统,并且它可以保持几年.
我还有一个很大的系统来构建,它强调我的道路并不是更清晰.我打算暂缓几个月,而这一切都解决了.个人而言,我正在为datajs工作(也查看JayData)
| 归档时间: |
|
| 查看次数: |
39568 次 |
| 最近记录: |