剖析微软的 REST 框架:Astoria

  • Dflying Chen
  • 陈黎夫

2007 年 9 月 30 日

话题:.NETRESTDevOps语言 & 开发架构

在最新的第十三期微软Architecture Journal杂志中,微软公司 SQL Server 团队的技术主管Pablo Castro详细地介绍了微软公司 REST 框架——Astoria 的几个重要的特性。

首先,Pablo 介绍说:

我认为 Astoria 是一个非常不错的 REST 框架。Astoria 将实体 / 记录的概念统一用资源来描述,且这些资源可以通过 URI 的结构来体现出层次。 所有的资源都可以通过统一的 HTTP 接口获取并进行维护,且框架也允许我们沿用传统的 Web 开发方法对程序进行分层或缓存。
随后,Pablo 解释了微软公司发起 Astoria 项目的原因,以及 Astoria 在当下流行的 Web 2.0 概念中的重要地位。
从服务器的角度来看,提供用于界面相关的资源显得较为易于理解,例如 HTML、CSS 以及图像文件等。不过提供数据却是另外一回事。至今为止,一般来讲与 数据打交道的交互过程应该发生于 Web 服务器和数据库服务器之间——似乎没有什么必要将数据直接暴露给运行于浏览器中的 Web 页面或是其他什么客户端软 件。但这个需求也恰好是 Astoria 框架的切入点。
与其他 REST 框架类似的是,Astoria 也允许开发者使用更加富有“语意”的 URL 来访问以及维护互联网上的资源。为了给出直观的案例,Astoria 开发团队还特意建立了一个演示服务器,将大家熟知的Northwind数据库的访问点通过 HTTP 协议直接暴露了出来。例如:
http://astoria.sandbox.live.com/northwind/northwind.rse/Customers

http://astoria.sandbox.live.com/northwind/northwind.rse/Customers[ALFKI]/Orders
Astoria 还与微软公司的.NET 框架完美地结合了起来,能够充分利用框架现有的各种强大的基础设施,Pablo 说到。
对于.NET 应用程序来说,Astoria 框架提供了一个运行于.NET 环境下的客户端类库,该类库能够自动将从 Astoria 服务中取得的数据封装为.NET 中的对象。这不但大大地简化了客户端应用程序开发者的工作,也能够很方便地与现有的使用.NET 对象的组件结合起来使用。

Astoria 用来定义数据架构的语法为实体数据模型(Entity Data Model,EDM),而 EDM 则已经得到了 ADO.NET 实体框架的内建支持。ADO.NET 实体框架还提供了一个强大的映射机制,让开发者能够很容易 地将 EDM 架构和实际的关系型数据库映射起来。

不但如此,Astoria 还可以支持其他非数据库类型(例如由 LINQ 查询语句得到)的数据源,并将其通过 HTTP 接口暴露出来。

Astoria 的设计架构非常灵活且易于扩展,允许开发者在其内建的资源层次上根据实际需要创建额外的自定义业务逻辑。例如 /Customers 或 /Products 等:

[WebGet]

public static IQueryable CustomersByCity(NorthwindEntities db, string city)

{

    if (city == null || city.Length < 3)

        throw new Exception(“bad city”);

    var q = db.Customers.Where(“it.City = @city”, new ObjectParameter(“city”, city));

    // add user-based filter condition to q

    return q;

}
随后即可使用如下的 URL 访问上述自定义的业务逻辑,并传递相应的参数。
/MyCustomersByCity?city=Seattle
在安全性方面,Pablo 及其团队成员把 Astoria 与 ASP.NET 内建的认证模型集成了起来,这也让我们能够很容易地在现有项目中引入该框架。
Astoria 将通过调用 ASP.NET 的相关 API 来获取用户的认证信息,因此对于那些使用 ASP.NET 认证机制的应用程序来说,无须任何修改即可直接应用 Astoria 框架。
若想了解更多有关 Astoria 框架的信息,请参考Astoria 团队的 Blog 以及Pablo 的 Blog

查看英文原文:Behind Microsoft's Astoria REST Framework

.NETRESTDevOps语言 & 开发架构