WCF Data Services,旧称ADO.NET Data Services Framework(代号Astoria,以下简称WCF DS)是基于 ADO.NET Entity Framework 上的一个简单资料供应服务 (Data Provisioning Services),也是微软的 REST (Representational state transfer) 的解决方案之一。特别为 AJAX,Silverlight以及Mashup应用程式提供资料服务所设计。
目前 ADO.NET DSF 已经内含于 .NET Framework 3.5 Service Pack 1 中。
发展背景
以往在发展像是 AJAX 应用程式时,服务端总是需要设计一个 HTTP 接口端口 (end point),通常都会使用 Web Service 来实现,但是随着 Mashup 应用程式的成长,若每次都要为一份(或一组)资料撰写 Web Service 或 HTTP end point 的话,对开发人员也是不小的负担,而且 Web Service 只支持 XML/SOAP 的资料格式,无法兼容于 Mashup 应用程式常用的 JSON 资料格式,微软也发现未来的 Silverlight 应用程式也是会面临到相同问题。
当时刚好微软的 ADO.NET Entity Framework 也正在开发中,它的 EDM 能力刚好可以提供给 WCF 资料存取的能力,因此微软特别以 ADO.NET Entity Framework 为基础,开发一个专门提供 HTTP 端点资料服务的资料供应层,即为 WCF DS。
架构
WCF DS 由 Entity Framework 中的 Entity Data Model (EDM) 为基底,Data Services Framework 的角色就是做为 EDM 的 HTTP 出入口,开发人员可以利用 HTTP 动词来存取 Data Services Framework,某种程度来说,WCF DS 是由 EDM + WCF 而成的一种资料供应服务,它可以被放在 WCF HTTP 通道,ASP.NET 以及 IIS 中。
WCF DS 的资料来源,可以是 ADO.NET Entity Framework,但如果是来自于其他的资料来源,则可以利用为该资料来源所实现的 LINQ Provider(有实现 IQueryable<T> 接口的组件,若要支持更新则必须要再实现 IUpdatable 接口)来做为资料来源亦可。
WCF DS 除了可以将 Entity 公开到 HTTP 通道中,也可以由开发人员自行发展具商业逻辑的自定义函数来回传资料,以及利用查询的解译器 (Query Interceptor) 来将查询 Entity 的资料做过滤后再回传。
存取方法
WCF DS 开放 EDM 在 HTTP 通道中,因此存取方法都要使用 HTTP 方式,GET/POST/PUT/DELETE 都可以使用,而且每个动词所代表的意义都不同。
- GET:查询资料。
- PUT:更新资料,必须要和 GET 并用,由 GET 抓下资料修改后,用 PUT 更新。
- POST:新增资料。
- DELETE:删除资料。
除了使用 HTTP 动词以外,WCF DS 另提供了 .NET Client Library 让 .NET Framework 应用程式可以存取,它也提供了让 LINQ 可以存取到 WCF DS 的能力(即 LINQ to WCF DS)。
下列为使用 LINQ to WCF DS 的示例:
using System;
using System.Data.Services.Client;
using System.Linq;
using NorthwindModel;
namespace TestApplication
{
class Program
{
static void Main(string[] args)
{
NorthwindEntities ctx = new NorthwindEntities(new Uri("http://localhost:1365/Northwind.svc"));
var q = from c in ctx.Customers
where c.City == "London"
orderby c.CompanyName
select c;
foreach (var cust in q)
{
Console.WriteLine(cust.CompanyName);
}
}
}
}
若是使用Silverlight 2.0开发,则可以使用 .NET Client Library for Silverlight 2.0 来简化设计,如下:
NorthwindEntities db = new NorthwindEntities(new Uri("http://localhost/NorthwindDataServices.svc/"));
var query = from c in db.Employees
select c;
AsyncCallback ac = asyncResult =>
{
var queryResult = (query as DataServiceQuery<NorthwindModel.Employees>).EndExecute(asyncResult);
foreach (var result in queryResult)
{
TextBlock item = new TextBlock();
item.Tag = result.EmployeeID;
item.Text = result.FirstName + " " + result.LastName;
this.lstEmployeeList.Items.Add(item);
}
};
(query as DataServiceQuery<NorthwindModel.Employees>).BeginExecute(ac, null);
资料格式
在 WCF DS 中,可支持 JSON (JavaScript Object Notation) 以及 ATOM 两种资料格式,因此可适用于多数的 Mashup 或 AJAX 应用程式。
参考资料
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.