随着.NET Framework 4.0 及 Visual Studio 2010 的发布, ADO.NET Data Services Framework 2.0 的版本也将同时发布,新的.Net 4.0 也会支持 System.Data.Services 空间方法库,这说明ADODSF将会得到进一步的发展和壮大。
.NET 的 WCF 3.5,有一个很重要的新功能,是对 REST (Representational State Transfer) 的支持。
REST (Representational State Transfer) 用最单纯的 URL 网址,就让一般客户、应用程序能直接访问、写入远程主机上的数据库。此外,微软实现 REST 的 ADO.NET Data Services,亦有一套安全控管、存取权限控管的机制,不必担心安全性的问题。
相对于微软的 WCF Service 要做一些设定,以及过去大家常用的 Web Service,此二者和 REST、ADO.NET Data Services 比较起来,相对就显得较复杂、不够弹性和灵活。
以往我们对外提供数据访问会开发一个Web Service 或者WCF,当需求不断的扩大,Web 服务会变得越来越多,维护也会变得越来越难。
ADO.NET Data Services Framework 主要用途是可以很容易的将数据库服务公开在网络上,然后透过URL网址就可以对数据库进行CRUD的操作。ADO.NET Data Services能通过一个REST化的方式将数据以Web上的数据服务展示。使得应用可以以数据服务的方式展现数据,然后被应用在企业网络和互联网上的Web客户端中。
提示:在Visual Studio 2010 当中出现了一个框架 WCF RIA Services 使得使用和操作数据信息变的更加简单
ADO.NET Data Services Framework 的第一个实例程序
打开Visual Studio 2010 新建一个 Web 应用程序
新建项目 选择 WCF DataService
自动为项目添加引用
打开DataService文件,显示如下内容,注释部分提示我们,这个类文件还没有完成(代办事项 TODO),需要我们手动为他添加上所需要的特定配置
设置1:数据源类名称
设置2:设置实体集与服务,更新等操作
namespace DataService { public class WcfDataService1 : DataService< /* TODO: put your data source class name here */ > { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. // Examples: // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead); // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } } }
添加项目Ado.Net Entity Data Model (ADO.Net Entity 已经无处不在了!),使用Northwind 数据库。
设置实体类
public class WcfDataService1 : DataService<NorthwindEntities> //添í加ó实μ体?集ˉ合?
设置Data Service 数据模型中表的访问控制
设置数据模型中表的访问控制。在DataServiceConfigration 中配置 EntitySetAccessRule,并传入给 InitializeService 方法。这是一个共享的方法,因此不管创建多少个DataService 文件类,该方法仅运行一次。在通过Visual Studio 调试时,如果你修改了该方法的代码,你需要记得强制重新编译。
public class WcfDataService1 : DataService<NorthwindEntities> //添í加ó实μ体?集ˉ合? { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. // 允ê许í读á取?所ù有D的?表í config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); // 允ê许í操ù作÷所ù有D的?表í,?所ù有D权¨限T // config.SetEntitySetAccessRule("*", EntitySetRights.All); // 允ê许í服t务?方?法¨所ù有D权¨限T // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All); //配?置?协-议é版?本?,?为a2.0 config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } }
编译解决方案,运行DataService文件,你会得到如下结果
http://localhost:1342/WcfDataService1.svc/Orders
将返回Northwind数据库中所有Orders的数据种子(feed)。如果你使用 IE 或者Firefox浏览器,浏览器将自动对种子应用样式表CSS,
不过你可以右键点击,并查看源文件就可以看到实际返回的数据。
查询语句简单入门
以下语法源自网络:
接下来您 (以及所有的客户端、客户端程序),即可直接透过此网址,去执行各种 ADO.NET Data Services 查询语法。例如下列语法,是要取出该表中的第一笔记录:
http://localhost:1342/WebDataService.svc/Products(1)
下列语法,是只要取出该笔记录的 ProductName 字段存储值 (经版工测试,在 Firefox 3.x 上亦可执行):
http://localhost:1342/WebDataService.svc/Products(1)/ProductName
下列语法,可查出 Orders 表中,CustomerID 为「ALFKI」的所有订单数据:
http://localhost:1342/WebDataService.svc/Customers('ALFKI')/Orders
结果会查出六笔记录。其语法等同于:
SELECT * FROM Orders WHERE CustomerID='ALFKI'
当然您还可下各种参数,如:top、orderby、filter(大于、小于、等于、不等于)、skip、expand 等等。如下列语法,可取出该表中 top 20 笔的数据:
http://localhost:1342/WebDataService.svc/Products?$top=20
当然您也可用一些逻辑算符、数学算符,以及 CURD 的操作,但目前不支持 sum、min、max、avg 函数,不支持 aggregate function 和 ISNULL、COALESCE 算符,但它自有一种 NULL 比对的语法,如下列语法,为取出 Products 表中,所有 UnitPrice 字段其内容不为 NULL 的记录:
http://localhost:1342/WebDataService.svc/Products?$filter=UnitPrice ne null
此外,ADO.NET Data Services 自有一套安全控管机制,例如只有某些账号能撷取某些表,某个群组的
客户端如何去使用Data Service
第一种 : .Net Client 类库方式
using System.Data.Services.Client; namespace DataService { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DataServiceContext dsc = new DataServiceContext(new Uri("http://localhost:1342/WcfDataService1.svc/Orders")); //查é询ˉ字?符?串? var query = dsc.Execute<Orders>(new Uri("http://localhost:1342/WcfDataService1.svc/Orders")); GridView1.DataSource = query; GridView1.DataBind(); } } }
第二种: 通过Service Reference创建客户端应用
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DataService { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ServiceReference1.NorthwindEntities ne = new ServiceReference1.NorthwindEntities(new Uri("http://localhost:1342/WcfDataService1.svc")); //查é询ˉ字?符?串? //与?前°面?使1用?Client 引y用?一?样ù,?实μ际ê上?也2是?使1用?了?Data Service 的?查é询ˉ方?式?和í接ó口ú,?只?是?通¨过y代ú理í来′访?问ê了? var query = ne.Execute<ServiceReference1.Orders>(new Uri("http://localhost:1342/WcfDataService1.svc/Orders")); GridView1.DataSource = query; GridView1.DataBind(); } } }
源代码下载:
fiddler 工具
介绍:
http://www.infoq.com/cn/news/2009/03/fiddler
代理: