为什么微软要推ADO.NET Data Services
微软在 .NET 3.5 SP1 平台上,推了一组新的数据访问 Framework,叫做 ADO.NET Data Services。微软怕程序员太闲吗?为什么要创造 ADO.NET Data Services?Web Service 和 WCF 不就很好用了吗?本帖整理一些研讨会及网络上大内高手的观点,并提供一个可在 VS 2008 SP1 上执行的示例给大家下载参考;但本帖不提供 step by step 实作教学,因为网络上已经有一堆这种文章了 (参考本帖最下面的「参考文件」第 6、第 7 点的文章,照着用 VS 2008 + SP1 操作,即可达成本帖提供下载的示例)。
.NET 的 WCF 3.5,有一个很重要的新功能,是对 REST (Representational State Transfer) 的支持。听说一些知名大型网站,及 RoR 阵营,都开始逐渐抛弃 Web Service,改提供 REST 的服务。所以微软这边也不能闲着,也搞了一套 ADO.NET Data Services 来支持 REST 的概念。
所谓的 REST,如同字面上的意思,是要让开发人员和应用程序 (当然也包括异质平台的应用程序),能以简单到不能再简单的方式,去访问和撷取网络上的数据和资源。怎么个简单法?REST 用最单纯的 URL 网址,就让一般客户、应用程序能直接访问、写入远程主机上的数据库。此外,微软实作 REST 的 ADO.NET Data Services,亦有一套安全控管、存取权限控管的机制,不必担心安全性的问题。
相对于微软的 WCF Service 要做一些设定,以及过去大家常用的 Web Service,此二者和 REST、ADO.NET Data Services 比较起来,相对就显得较复杂、不够弹性,且 Web Service 还有最为人垢病的 p
erformance 问题。
过去如果你是一间公司的 MIS,当 A 部门的员工需要某些数据,你可能会随手写一支 Web Service 开放这些数据给别人使用;过不久 B 部门的主管又需要别的数据,你可能就再写另一支 Web Service,开放另一台主机数据库中的数据给别人使用。日积月累下来,几十上百支的 Web Service 可能就难以维护和管理,如此做法就显得不够弹性。而且别人在呼叫这些 Web Service 时,必须先知道主机的位置、函数的名称及功能、传入的参数及类型,在引用上仍不够方便。
但若透过 REST、ADO.NET Data Services,当你想公开某一台主机上的数据库 Northwind,给远程的一般 user、开发人员或应用程序访问 (包括 SELECT、INSERT、UPDATE、DELETE 等 CRUD 动作) 时,只要提供下列的 URL,搭配 HTTP Verbs (GET, POST, ...) 即可:www.网站名称/Northwind
若要让他们能访问 Northwind 数据库中的 Products 表时,只要提供下列的 URL 即可:www.网站名称/Northwind/Products
为什么要用ajax亦即 ADO.NET Data Services 是一个远程主机数据访问的「中介服务」,可由客户端、客户端应用程序,自行决定数据存取的内容和方式。
因此将来的 URL 指向的不再只是一个网址,而可能是某个数据库、数据来源、云端运算 [15,16,17];而且分布式环境中的 AJAX、WCF、Silverlight 等客户端应用程序,要使用这个 REST-based 服务也相当简单,尤其是 AJAX 不用再手工搞一堆 JavaScript;将来要在异质系统之间交换数据,将会有比 Web Service 更方便、更好用的选择,
苦命的程序员将来或许真的能 REST 了 (虽然实际上只是梦想)。
在 .NET 平台方面,未来的 .NET Framework 4.0 及 Visual Studio 2010,仍有 ADO.NET Data Services Framework 2.0 的版本,也有新的 4.0 版的 System.Data.Services 函式库,因此预估 ADO.NET Data Services 将来应不至于被微软淘汰,程序员可放心学习。
(执行本示例,需要 VS 2008 + SP1,以及 SQL Server 的 Northwind 数据库。若无法执行,请在本帖留言告知)
-------------------------------------------------
此一示例,是参考本帖最下方「参考文件」的第 6、第 7 这两篇文章的教学实作出来的,在此不再赘述过程。下载代码后,直接双击 testDS.sln,即会以 VS 2008 (SP1) 开启两个 project,如下图 1 所示。
图 1 鼠标指的 WebDataService.svc,即为开放在 URL 中给所有客户引用的 Data Services 服务
图 1 下方的 ds_server 项目,即为提供服务的 ADO.NET Data Services,透过一个 O/R Mapping 的 EDM 档案 [2],以和 ADO.NET Entity Framework 同样的做法,提供客户走访整个 SQL Server 2005 的 Northwind 数据库。
如同 WCF,在 ADO.NET Data Services 中也以 .svc 格式的档案提供网络上的服务。请您如上图 1,在 VS 2008 中,以鼠标右键,透过浏览器直接开启 WebDataService.svc 档案,此时您应该会看到如下图 2 的画面,亦即列出 Northwind 数据库中所有的表名称。
图 2 ADO.NET Data Services 默认会以 XML / Atom 格式回传所有的数据
假设您开启的网址如下:localhost:埠号/ds_server/WebDataService.svc/
此时,只要在后面再加上表名称,即可 SELECT 出该表的所有内容。如下列语法,即为撷取出整个 Pro
ducts 表的内容,并以 XML / Atom 格式回传:localhost:埠号/ds_server/WebDataService.svc/Products 若您在 IE 中看不到上图 2 的内容,是因为以 Atom 格式回传,浏览器会自动进行格式化处理。请如下图 3 (以IE 7.0 为例),关闭浏览器中的自动格式化动作,再按 F5 重新整理网页:
图 3 在 IE 7 中,取消勾选「启动摘要读取检视」
接下来您 (以及所有的客户端、客户端程序),即可直接透过此网址,去执行各种 ADO.NET Data Services 查询语法。例如下列语法,是要取出该表中的第一笔记录:
localhost:1056/ds_server/WebDataService.svc/Products(1)
下列语法,是只要取出该笔记录的 ProductName 字段存储值 (经版工测试,在 Firefox 3.x 上亦可执行):localhost:1056/ds_server/WebDataService.svc/Products(1)/ProductName
下列语法,可查出 Orders 表中,CustomerID 为「ALFKI」的所有订单数据:
localhost:1056/ds_server/WebDataService.svc/Customers('ALFKI')/Orders结果会查出六笔记录。其语法等同于:
SELECT * FROM Orders WHERE CustomerID='ALFKI'
当然您还可下各种参数,如:top、orderby、filter(大于、小于、等于、不等于)、skip、expand 等等。如下列语法,可取出该表中 top 20 笔的数据:
localhost:1056/ds_server/WebDataService.svc/Products?$top=20
当然您也可用一些逻辑算符、数学算符,以及 CURD 的操作,但目前不支持 sum、min、max、avg 函数,不支持 aggregate function 和 ISNULL、COALESCE 算符,但它自有一种 NULL 比对的语法,如下列语法,为取出Products 表中,所有 UnitPrice 字段其内容不为 NULL 的记录:
localhost:1056/ds_server/WebDataService.svc/Products?$filter=UnitPrice ne null 有关其语法细节,有兴趣的网友们可参考本帖下方的参考文件 [11],以及网络上的文件。此外,ADO.NET Data Services 自有一套安全控管机制,例如只有某些账号能撷取某些表,某个组的用户才有写入数据库的权限,程序员不必担心安全性的问题。
接下来要提到,若此 Data Services 要给客户端使用,您当然不可能丢一个 URL 叫他自己去下查询语法,因此各个程序员必须撰写客户端程序,去呼叫这个 Service。请您参考本帖先前的图 1,在 VS 2008 中,将上方的ds_client 项目设定为「启始项目」;接着检视该项目中 Program.cs 其代码,如下图 4,将其中 localhost 后面的 port number,改成您先前用浏览器执行 WebDataService.svc 时,VS 2008 中虚拟 Web server 随机给的埠号;改完后存储,再按 F5 直接执行 ds_client 项目,即会看到图 4 右下方的 console mode 执行画面,会先引用
ds_server 项目中的 WebDataService.svc 服务,再用 C# 3.0 的 LINQ 去访问 Products 表,并列出其中两个字段的内容值。
图 4 透过 LINQ 及 EDM 做 O/R Mapping,客户端程序及程序员无须知道后端数据库位于何处,以及 SQL 语句该如何撰写
结论:
如同本帖的标题,为什么微软要创造 ADO.NET Data Services Framework?这门技术和 REST 的观念,是为了「简化」程序员的工作,在分布式环境或异质平台上做数据交换时,只要透过既有的 HTTP protocol 和 URIs 网址,就能提供比 Web Service 更简易的远程程序调用能力。且 ASP.NET AJAX 4.0
、Silverlight 2.0、VS 2010 都已内建支持 ADO.NET Data Services,甚至微软将来的「云端服务 (Azure Service)」也支持该服务。或许未来微软要进一步拓展其野心,会叫各企业将其应用系统,都尽量由微软代管,经由云端服务 + Data Services 让企业用户觉得方便又省钱,也因此各大企业及 IT 从业人员,日后也更难脱离微软帝国的掌控。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论