在本文中,将探讨如何使用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中给结果。