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






4.74/5 (40投票s)
在本篇文章中,我们将学习如何使用 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 服务。演示应用程序的架构将如下图所示:
目录
为了使文章篇幅合理,本文分为两部分。两篇文章的内容按以下大纲安排:
第一部分
- 为什么选择 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 进行此演示的原因如下:
- WCF 在许多实时企业应用程序中使用,因为它是一项成熟的技术,并且仍然适用。
- Web API 是新的,并且只能支持 HTTP 客户端。WCF 在这方面非常灵活且可扩展。
- WCF 默认支持 SOAP,但使用 WCF 创建 RESTful 服务需要一些额外的努力和注意事项。
- 最后,如果从头开始进行新开发,并且我们确定仅 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 操作。
- 打开 Visual Studio 2013,通过选择名为“DemoWCFServiceApp”的“WCF 服务应用程序”模板来创建 WCF 服务,然后单击“确定”,如下图所示:
- Visual Studio 2013 会在解决方案中添加一个 DemoWCFServiceApp 项目,如下面的屏幕截图所示:
- 现在我们将根据我们的需求修改 DemoWCFServiceApp 项目解决方案。因此,删除现有的 IService1.cs 和 Service1.svc 文件,然后添加其他一些文件,如下面的屏幕截图所示。我们将在后续部分中在这些文件中编写代码。
创建数据库和存储库
- 在 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>
- 正如您在存储库文件夹中看到的,其中包含两个文件 ICustomerRepository.cs 和 CustomerXmlRepository.cs。在接口 ICustomerRepository 中,我们将声明四个方法,如下所示:
interface ICustomerRepository { IEnumerable<CustomerEntity> GetAllCustomers(); void AddCustomer(CustomerEntity customer); void DeleteCustomer(int id); void EditCustomer(CustomerEntity customer); int GetCustomersCount(); }
- 现在 CustomerXmlRepository 类将实现 ICustomerRepository 接口。由于代码非常简单,我们此处不显示 CustomerXmlRepository 中的全部代码。请下载代码并查看 CustomerXmlRepository 类中实现方法所编写的代码。
- 在 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 服务
- 接口 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(); }
- CustomerService 将实现 ICustomerService 合同。这里我们使用构造函数作为依赖注入。依赖注入有助于编写解耦的代码。有关依赖注入的更多信息,请访问此处。CustomerService 类的外观如下:
- 最后,我们将配置此服务的终结点。服务的终结点解释以下三件事:
- 地址:定义“在哪里”。地址是识别服务位置的 URL。
- 绑定:定义“如何”。绑定定义了如何访问服务。在我们的例子中,我们使用的是“webHttpBinding”。
- 契约:定义“什么”。契约标识服务应该公开什么。我们的服务向客户端公开“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 格式的数据,如下面的屏幕截图所示:
我使用了 Google Chrome 浏览器,但您可能正在使用不同的浏览器,但关键是您必须能够获得 JSON。根据不同的浏览器,您可能会以不同的格式看到 JSON 数据,或者会下载一个包含 JSON 数据的文件,您可以用记事本查看它。另外,当您在 Visual Studio 中点击运行按钮时,如果焦点在 .svc 文件上,则会打开“WCF 测试客户端”窗口,否则会打开选定的浏览器。在这两种情况下,服务都会运行并启动。
结论
在本篇文章中,我们学习了如何使用 Visual Studio 2013 创建 WCF RESTful 服务。在下一部分中,我们将创建一个具有 WebGrid 控件的 ASP.NET MVC 5 应用程序。对于 CRUD 操作,MVC 应用程序将调用我们刚刚创建的 WCF 系列。欢迎您提出评论和建议。谢谢。