65.9K
CodeProject 正在变化。 阅读更多。
Home

初学者教程:创建 WCF 数据服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (21投票s)

2013 年 4 月 4 日

CPOL

5分钟阅读

viewsIcon

153544

downloadIcon

5516

在本文中,我们将了解如何使用 WCF 数据服务创建符合 ODATA 标准的 RESTful 服务。

引言

在本文中,我们将了解如何使用 WCF 数据服务创建符合 ODATA 标准的 RESTful 服务。我们将了解如何使用 Visual Studio 提供的模板来创建 WCF 数据服务,如何使用 ODATA 协议使用它们,以及如何从 .Net 客户端应用程序中消费它们。

背景

什么是 ODATA

ODATA 是一种协议,我们可以通过它使用 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 入门介绍[^])。生成的实体将如下所示。


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


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


添加此服务模板后,所有必需的引用都将添加到项目中,并且服务模板将为我们提供一个类似这样的服务类实现模板


现在,在此模板中,我们必须在服务实现类的基类(即 DataService<T>)中指定(上面图片中的 1)数据源类名。在我们的例子中,这个类是 SampleDbEntities。在第二个位置(图片中的 2),我们需要指定我们想通过此服务公开的实体以及这些实体的访问规则。让我们通过放置一个 * 来简单地为所有实体授予所有权限。

生成的代码将如下所示

public class BooksWcfDataService : DataService<SampleDbEntities>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}

注意:EntitySetRights ServiceOperationRights 枚举值是仔细查看以精细控制权限的重要事项。

现在,让我们运行服务,并通过编写符合 ODATA 标准的 URL 查询在浏览器中查看结果。

https:///BooksWcfDataService.svc/Books


https:///BooksWcfDataService.svc/Books(3)


支持 JSON 格式

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

最简单的方法是使用一个自定义属性,它可以监视请求并在处理请求之前应用所需的标头。MSDN 代码库中有一个现成的类,它执行完全相同的操作 [http://archive.msdn.microsoft.com/DataServicesJSONP[^]]

从上面的链接,我们需要使用 JSONPSupportBehaviorAttribute 类,并用它来修饰服务实现类。该类将内部使用其自定义消息分派行为来处理标头信息。类生成的实现如下所示

[JSONPSupportBehavior]
public class BooksWcfDataService : DataService<SampleDbEntities>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}

注意:查看实现将使该组件的内部处理非常清楚。尽管对于初学者来说,要完全理解这些类可能有些复杂和令人困惑。

现在,由于我们的服务已启用 JSON 支持,让我们尝试查看 JSON 响应。

https:///BooksWcfDataService.svc/Books?$format=json 


消费 WCF 数据服务

现在我们已经了解了如何创建 WCF 数据服务,以及如何仅通过使用 HTTP 协议和编写符合 ODATA 标准的 URL 来获取结果。现在,如果我们想通过 .NET 客户端应用程序访问此 WCF 数据服务,我们该怎么做?因此,让我们创建一个简单的网站,逐步了解如何消费此 WCF 数据服务。

  1. 在网页上添加一个简单的 GridView
  2. 添加 WCF 数据服务的服务引用。
  3. 使用服务引用在客户端应用程序中创建 SampleDbEntities
  4. 将服务的 Uri,即 svc 文件,传递给 SampleDbEntities 的构造函数。
  5. 现在,将 SampleDbEntities 对象用作普通的 Entity Framework 实体。

以下代码显示了我们代码隐藏文件中的结果代码。

protected void Page_Load(object sender, EventArgs e)
{
    ServiceReference1.SampleDbEntities entities = 
        new ServiceReference1.SampleDbEntities
            (
                new Uri("https://:51039/BooksWcfDataService.svc")
            );

    GridView1.DataSource = entities.Books;
    GridView1.DataBind();
}

现在运行客户端应用程序将在 GridView 中显示结果,如下所示


关注点

在本文中,我们了解了如何轻松创建 WCF 数据服务。我们还了解了如何将响应格式配置为 XML 或 JSON。我们开发了一个客户端应用程序来消费此 WCF 数据服务。本文旨在作为创建数据服务的起点,并未讨论与权限等相关的各种配置。强烈建议阅读有关这些内容的信息。希望本文有所信息。

历史

  • 2013 年 4 月 4 日:初版。
© . All rights reserved.