WCF Data Services

WCF Data Services,旧称ADO.NET Data Services Framework(代号Astoria,以下简称WCF DS)是基于 ADO.NET Entity Framework 上的一个简单资料供应服务 (Data Provisioning Services),也是微软的 REST (Representational state transfer) 的解决方案之一。特别为 AJAXSilverlight以及Mashup应用程式提供资料服务所设计。

WCF Data Services 架构图

目前 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 两种资料格式,因此可适用于多数的 MashupAJAX 应用程式。

参考资料