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

WCF RESTful 服务和 ASP.NET MVC 5 中的 WebGrid - 第 1 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (40投票s)

2014 年 6 月 21 日

CPOL

6分钟阅读

viewsIcon

112627

downloadIcon

3059

在本篇文章中,我们将学习如何使用 WebGrid 控件在 ASP.NET MVC 5 应用程序中创建 WCF RESTful 服务并消费这些服务。

引言

在本篇文章中,我们将学习如何使用 WebGrid 控件在 ASP.NET MVC 5 应用程序中创建 WCF RESTful 服务并消费这些服务。这是文章的第一部分,共两部分。在第一部分中,我们将从定义术语开始,并解释为什么我选择 WCF RESTful 进行此演示,而不是 ASP.NET Web API(这是创建现代 ASP.NET 世界中的 RESTful 服务的标准)。然后,我们将创建一个具有数据库(XML 文件)、存储库和使用 Visual Studio 2013 的 WCF RESTful 服务的演示。

第 2 部分中,我们将使用 ASP.NET MVC 自带的 WebGrid 控件执行 CRUD 操作。为了执行 CRUD 操作,ASP.NET MVC 应用程序中的控制器类将调用在第 1 部分中创建的 WCF 服务。演示应用程序的架构将如下图所示:

Architecture of demo application

目录

为了使文章篇幅合理,本文分为两部分。两篇文章的内容按以下大纲安排:

第一部分

  • 为什么选择 WCF RESTful 而不是 ASP.NET Web API
  • 创建项目结构
  • 创建数据库和存储库
  • 创建 WCF RESTful 服务
  • 验证 JSON 输出

第二部分:

  • 创建 ASP.NET MVC 5 应用程序
  • 将数据显示在 WebGrid 控件中
  • 添加内联编辑操作
  • 添加内联删除操作
  • 添加创建操作

为什么选择 WCF RESTful 而不是 ASP.NET Web API

首先,我们从几行文字开始定义所使用的术语(以及更多相关链接,这将对初学者有所帮助)

WCF:Windows Communication Foundation (WCF) 是一个用于构建面向服务应用程序的框架。它用于构建在网络上通信的应用程序,无论其风格或协议如何。请参阅MSDN 网站以了解更多信息。

RESTful:RESTful 用作形容词,用于描述尊重 REST 约束的事物。REST 代表 Representational State Transfer,这是一种使用简单的 HTTP 调用在服务器上创建、读取、更新或删除信息的方式。有关 REST 的更多信息,请参阅维基百科页面

ASP.NET Web API:ASP.NET Web API 是在 .NET Framework 上构建 RESTful 应用程序的理想平台。要了解有关 Web API 的更多信息,请访问其主页

为什么选择 WCF RESTful 而不是 ASP.NET Web API:对我来说,选择 WCF 而不是 Web API 进行此演示的原因如下:

  1. WCF 在许多实时企业应用程序中使用,因为它是一项成熟的技术,并且仍然适用。
  2. Web API 是新的,并且只能支持 HTTP 客户端。WCF 在这方面非常灵活且可扩展。
  3. WCF 默认支持 SOAP,但使用 WCF 创建 RESTful 服务需要一些额外的努力和注意事项。
  4. 最后,如果从头开始进行新开发,并且我们确定仅 HTTP 支持就足够了,那么我们应该选择 Web API。但情况并非总是如此,因此学习 WCF 如何提供 RESTful 服务是很有益的。

创建项目结构

在开始之前,请注意在遵循创建演示应用程序的步骤时以下几点:

  • 具备 WCF 和 ASP.NET MVC 的基本知识是先决条件。我们通过存储库(CustomerXmlRepository 类)调用数据库,该存储库基于标准的存储库模式。此模式在MSDN 网站本文中有非常好的描述。
  • 为了方便起见,我们将使用 XML 文件作为数据库。您可以根据自己的方便使用任何数据库,但请在存储库中进行必要的更改。
  • 我们使用 Visual Studio 2013 开发了附带的演示代码。您也可以使用 Visual Studio 2012,但需要安装 ASP.NET MVC 5。如果安装了 MVC 5,附带的代码将在 Visual Studio 2013 或 2012 中正常运行。
  • 如果您使用的是旧版本的 Visual Studio,则需要创建类似的解决方案,并注意因版本不同而产生的细微变化。

让我们开始创建一个 WCF RESTful 服务的示例,该服务将公开四个操作合同(方法)来执行 CRUD 操作。

  1. 打开 Visual Studio 2013,通过选择名为“DemoWCFServiceApp”的“WCF 服务应用程序”模板来创建 WCF 服务,然后单击“确定”,如下图所示:

    Choose Application Template for ASP.NET MVC4
     
  2. Visual Studio 2013 会在解决方案中添加一个 DemoWCFServiceApp 项目,如下面的屏幕截图所示:

    Solution Explorer
     
  3. 现在我们将根据我们的需求修改 DemoWCFServiceApp 项目解决方案。因此,删除现有的 IService1.cs 和 Service1.svc 文件,然后添加其他一些文件,如下面的屏幕截图所示。我们将在后续部分中在这些文件中编写代码。

    Modified Solution Structure
     

创建数据库和存储库

  1. 在 App_Data 文件夹下,打开上一步创建的 CustomerDB.xml 文件,并填充一些数据,如下所示:
    <?xml version="1.0" encoding="utf-8"?>
    <customers>
      <customer>
        <id>1</id>
        <name>Jim</name>
        <address>Orlando</address>
      </customer>
      <customer>
    .......
    .......
    </customers>                        
                    
  2. 正如您在存储库文件夹中看到的,其中包含两个文件 ICustomerRepository.cs 和 CustomerXmlRepository.cs。在接口 ICustomerRepository 中,我们将声明四个方法,如下所示:
    interface ICustomerRepository
        {
            IEnumerable<CustomerEntity> GetAllCustomers();
            void AddCustomer(CustomerEntity customer);
            void DeleteCustomer(int id);
            void EditCustomer(CustomerEntity customer);
            int GetCustomersCount();
        }
    
  3. 现在 CustomerXmlRepository 类将实现 ICustomerRepository 接口。由于代码非常简单,我们此处不显示 CustomerXmlRepository 中的全部代码。请下载代码并查看 CustomerXmlRepository 类中实现方法所编写的代码。
     
  4. 在 CustomerEntity.cs 文件中,CustomerEntity 类被 [DataContract] 属性装饰,其属性被 [DataMember] 属性装饰。DataContractSerializer 序列化被 [DataMember] 属性装饰的公共属性,如下所示:
        [DataContract]
        public class CustomerEntity
        {
            [DataMember]
            public int CustomerId { get; set; }
            [DataMember]
            public string CustomerName { get; set; }
            [DataMember]
            public string CustomerAddress { get; set; }
            public CustomerEntity(int id, string name, string address)
            {
                this.CustomerId = id;
                this.CustomerName = name;
                this.CustomerAddress = address;
            }
        }
    

创建 WCF RESTful 服务

  1. 接口 ICustomerService 是一个 ServiceContract,它描述了一个服务可以向外部世界公开什么。当我们实现 WCF RESTful 服务时,我们必须使用 HTTP 动词,如 GET、POST、PUT 和 DELETE。WebGet 方法仅用于 GET 动词,WebInvoke 方法用于 POST、PUT 和 DELETE。以下是我们需要在 ICustomerService.cs 中编写的代码:
        [ServiceContract]
        public interface ICustomerService
        {
            // WebGet attribute is used to make GET request in WCF REST service
            [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "GetAllCustomers")]
            IEnumerable<CustomerEntity> GetAllCustomers();
            
            // WebInvoke attribute is used to make POST, DELETE and PUT request in WCF REST service
            [WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, Method = "POST", UriTemplate = "AddCustomer")]
            void AddCustomer(CustomerEntity customer);
            
            [WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, Method = "DELETE", UriTemplate = "DeleteCustomer")]
            void DeleteCustomer(int id);
            
            [WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, Method = "PUT", UriTemplate = "EditCustomer")]
            void EditCustomer(CustomerEntity customer);
            
            [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "GetCustomersCount")]
            int GetCustomersCount();
        }
    
  2. CustomerService 将实现 ICustomerService 合同。这里我们使用构造函数作为依赖注入。依赖注入有助于编写解耦的代码。有关依赖注入的更多信息,请访问此处。CustomerService 类的外观如下:

    Service Class
     
  3. 最后,我们将配置此服务的终结点。服务的终结点解释以下三件事:
     
    1. 地址:定义“在哪里”。地址是识别服务位置的 URL。
    2. 绑定:定义“如何”。绑定定义了如何访问服务。在我们的例子中,我们使用的是“webHttpBinding”。
    3. 契约:定义“什么”。契约标识服务应该公开什么。我们的服务向客户端公开“DemoWCFServiceApp.ICustomerService”。


    以下是 Web.config 中定义我们服务终结点aneous 的代码:
         <services>
          <service name="DemoWCFServiceApp.CustomerService">
            <endpoint address="" behaviorConfiguration="webBehavior" binding="webHttpBinding" contract="DemoWCFServiceApp.ICustomerService" />
          </service>
        </services>
    

注意:现在我们可以将服务配置为具有各自地址、行为和契约的多个终结点。如果您有兴趣将同一服务公开给 RESTful 和 SOAP 客户端,请查看此处 Stack Overflow 上的讨论这篇文章

验证 JSON 输出

运行服务,并在浏览器中输入 URL:https://:1786/CustomerService.svc/GetAllCustomers 进行测试。希望您能看到 JSON 格式的数据,如下面的屏幕截图所示:

HTML Layout of Views

我使用了 Google Chrome 浏览器,但您可能正在使用不同的浏览器,但关键是您必须能够获得 JSON。根据不同的浏览器,您可能会以不同的格式看到 JSON 数据,或者会下载一个包含 JSON 数据的文件,您可以用记事本查看它。另外,当您在 Visual Studio 中点击运行按钮时,如果焦点在 .svc 文件上,则会打开“WCF 测试客户端”窗口,否则会打开选定的浏览器。在这两种情况下,服务都会运行并启动。

结论

在本篇文章中,我们学习了如何使用 Visual Studio 2013 创建 WCF RESTful 服务。在下一部分中,我们将创建一个具有 WebGrid 控件的 ASP.NET MVC 5 应用程序。对于 CRUD 操作,MVC 应用程序将调用我们刚刚创建的 WCF 系列。欢迎您提出评论和建议。谢谢。

© . All rights reserved.