创建和使用OData RESTful服务

在本文中,将探讨如何使用Visual Studio提供的模板创建OData协议的WCF数据服务,以及如何使用这些服务并从.NET客户端应用程序中消费它们。

什么是OData

OData(Open Data Protocol)是一种协议,它允许使用AtomPub协议共享和访问数据。AtomPub协议主要用于从网站创建订阅源。它建立在REST架构哲学之上,其中远程数据资源的CRUD操作可以通过HTTP协议如GET、PUT、POST和DELETE来执行。(有关更多详细信息,请参阅:《创建WCF REST服务初学者教程》)

什么是WCF数据服务

WCF数据服务是Visual Studio中提供的现成模板,它使能够轻松创建符合OData协议的WCF服务。它建立在WCF REST服务之上。WCF数据服务以前被称为ADO.NET数据服务。这个模板使能够使用OData协议公开服务中的任何数据。它在WCF REST服务之上实现,以提供符合OData的数据访问,并且大部分样板功能已经就绪。开发人员只需要配置数据源,并让服务模板知道需要公开哪些数据以及相应的权限。

使用代码

创建WCF数据服务

现在,让看看如何创建一个简单的WCF数据服务,该服务将通过OData协议公开一个简单的数据库。

创建服务

要创建服务,首先需要创建一个简单的ASP.NET Web应用程序,它将为该服务提供托管环境。所以让首先创建一个简单的ASP.NET Web应用程序。

一旦准备好了ASP.NET Web应用程序,接下来的事情就是向App_data文件夹中添加数据库。将创建一个Books表,并尝试对这个表执行CRUD操作。

为了在服务中执行数据库操作,让使用Entity Framework。(有关Entity Framework的更多信息,请参阅:《Entity Framework绝对初学者入门》)。

生成的实体将如下所示:

public class Book { public int BookId { get; set; } public string Title { get; set; } public string Author { get; set; } }

让也在表中添加一些示例数据,以便能够测试服务。

现在有了数据库和数据访问逻辑。让现在向这个项目添加一个WCF数据服务。

一旦添加了这个服务模板,所有必需的引用将被添加到项目中,服务模板将给一个服务类实现模板,如下所示:

public class BooksWcfDataService : DataService<SampleDbEntities> { public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.All); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } }

注意:EntitySetRights和ServiceOperationRights枚举值是控制权限的重要部分。

现在让运行服务,并尝试在浏览器中通过编写OData协议的URL查询来查看结果。

例如:

http://localhost/BooksWcfDataService.svc/Books http://localhost/BooksWcfDataService.svc/Books(3)

支持JSON格式

OData协议还规定,任何带有$format=json参数的查询都应该以JSON格式返回相同的结果。WCF REST服务支持JSON输出,但默认情况下WCF数据服务不支持。要启用此支持,需要检查传入的请求,如果它包含$format=json参数,需要设置头信息以接受application/json请求。

最简单的方法是有一个自定义属性,它可以监控请求,并在处理此请求之前应用所需的头信息。MSDN代码库中有一个现成的类可以做到这一点。

从上面的链接中,需要使用JSONPSupportBehaviorAttribute类,并用它来装饰服务实现类。这个类将内部使用其自定义消息调度行为来处理头信息。类的实现如下所示:

[JSONPSupportBehavior] public class BooksWcfDataService : DataService<SampleDbEntities> { public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.All); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } }

注意:查看实现将使这个组件的内部处理非常清晰。尽管对于初学者来说,完全理解这些类可能会有点复杂和混乱。

现在已经为服务启用了JSON支持,让尝试查看JSON响应。

http://localhost/BooksWcfDataService.svc/Books?$format=json

消费WCF数据服务

现在已经看到如何创建WCF数据服务,以及如何配置响应格式为XML或JSON。开发了一个客户端应用程序来消费这个WCF数据服务。本文旨在作为创建数据服务的起点,并没有讨论与权限等相关的各种配置。强烈建议阅读有关这些内容。

例如:

protected void Page_Load(object sender, EventArgs e) { ServiceReference1.SampleDbEntities entities = new ServiceReference1.SampleDbEntities( new Uri("http://localhost:51039/BooksWcfDataService.svc") ); GridView1.DataSource = entities.Books; GridView1.DataBind(); }

现在运行客户端应用程序将在GridView中给结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485