Welcome

首页 / 软件开发 / .NET编程技术 / 一个创建 OData 的新选项: Web API

一个创建 OData 的新选项: Web API2014-03-10 MSDN Julie Lerman早在 OData 规范出现以前,Microsoft .NET 开发人员就已能够创建 OData 源。借助 WCF 数据服务,可使用具象状态传输 (REST) 在 Web 上公开实体数据模型 (EDM)。换句话说,可 经由以下 HTTP 调用使用这些服务: GET、PUT、DELETE 等。随着创建这些服务的框架的发 展(中途数次更改名称),输出也在不断演变,并最终形成以 OData 规范 (odata.org) 封装的形态。目前已出现多种可使用 OData 的 客户端 API,来源如 .NET、PHP、JavaScript 以及其他众多客户端。但直到最近,能够轻松 创建服务的唯一方式仍是借助 WCF 数据服务。

WCF 数据服务是一项 .NET 技术,它 可对 EDM(.edmx,或通过 Code First 定义的模型)进行简单的封装然后公开该模型,以供 经由 HTTP 查询和更新。由于这些调用采用 URI 形式(如 http://mysite.com/mydataservice/­Clients(34)),因此,您甚至可以通过 Web 浏览 器或 Fiddler 之类的工具执行查询。为方便创建 WCF 数据服务,Visual Studio 提供了一 个项目模板,可用来构建使用一组 API 的数据服务。

现在又出现了一种创建 OData 源的新方式 — 利用 ASP.NET Web API。在本文中,我将概述这两种方法之间的某些区别, 并就如何在两者间作出选择给予指导。此外,我还将介绍某些与创建 Web API 不同的 OData API 创建方式。

API 对数据服务(宏观角度)

WCF 数据服务是一种 System.Data.Services.DataService,它包装已定义的 ObjectContext 或 DbContext。在声 明该服务类时,它是包含上下文的泛型 DataService(即 DataService<MyDbContext> )。它在初始时呈完全锁定状态,因此,应在需要公开该服务的上下文的 DbSets 构造函数 中设置访问权限。这就是您需要完成的全部操作。其余工作都由底层的 DataService API 负 责处理: 在对该服务的客户端应用程序 HTTP 请求的响应中直接与上下文交互,以及查询和 更新数据库。另外,也可以向该服务添加一些自定义设置,重写其部分查询或更新逻辑。但 在大多数情况下,其目的在于让 DataService 负责与上下文的大部分交互工作。

另 一方面,可借助 Web API 在对 HTTP 请求(PUT、GET 等)的响应中定义上下文交互。由 API 公开方法,由您定义方法逻辑。您不必与实体框架乃至数据库进行交互。您可以拥有客 户端正在请求或发送的内存中对象。访问点不会像在使用 WCF 数据服务时那样神奇地创建出 来;相反,需要您来控制如何响应这些调用。这是选择服务而非 API 来公开 OData 的决定 性因素。如果需要公开的大部分操作只是简单的 Create、Read、Update、Delete (CRUD) 而 无需进行大量自定义设置,那么数据服务将是您的最佳选择。如果需要自定义大量行为,那 么使用 Web API 更为适宜。

我很赞同 Microsoft Integration MVP Matt Milner 在 最近一次聚会上的阐述方式: “WCF 数据服务适合于从数据和模型开始,并且只希望公开它 们的情形。而从 API 开始且需要定义应公开哪些内容时,使用 Web API 会更合适。”

使用标准 Web API 打下基础

我发现,对于缺乏 Web API 使用经验的新手 来说,在了解新的 OData 支持之前,最好先学习一些 Web API 的基础知识,然后弄清它们 与创建 Web API(用于公开 OData)有何关联。在本文中,我将这样做:首先创建一个使用 实体框架作为其数据层的简单 Web API,然后将其转换为提供 OData 形式的结果。

Web API 的用途之一是作为模型-视图-控制器 (MVC) 应用程序中标准控制器的替代 品,可将其创建为 ASP.NET MVC 4 项目的一部分。如果不需要前端,则可从空的 ASP.NET Web 应用程序开始,然后添加 Web API 控制器。但是,为了照顾新手,我将从 ASP.NET MVC 4 模板开始(因为它提供了会生成部分起始代码的基架)。当您了解各部分是如何结合在一 起的之后,就可以直接从空项目开始工作了。

因此,我将创建一个新的 ASP.NET MVC 4 应用程序,然后在系统提示时选择空模板(不是 Web API 模板,Web API 模板是专为使用 视图的更强大应用程序而设计的,在这里就大材小用了)。这将生成一个 Models、Views 和 Controllers 均为空文件夹的 MVC 应用程序项目组织结构。图 1 将空模板和 Web API 模板 生成的结果进行了对比。您会发现,空模板生成的组织结构要简单得多,我所需要做的只是 删除几个文件夹。

图 1 使用空模 板和 Web API 模板生成的 ASP.NET MVC 4 项目