WCF学习之旅——第一个WCF示例(一)
WCF学习之旅目录
最近需要用到WCF,所以对WCF进行了解。在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例。
本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构。希望本文能对那些准备开始学习WCF的初学者提供一些帮助。
在这个例子中,我将实现一个简单的书籍数据查询功能(BookService),即根据书籍ID去查询对应书籍的信息,并显示出来。和传统的分布式通信框架一样,WCF本质上提供一个跨进程、跨机器、跨网络的服务调用。在本例中,客户端和WCF应用服务通过运行在同一台机器上的不同进程模拟。如下图。
WCF应用服务运行环境
WCF应用服务不能单独存在,无法独立运行,WCF应用服务需要寄宿于一个正在运行中的进程之内。我们把承载WCF应用服务的进程称为宿主,为WCF应用服务指定宿主的过程称为服务寄宿 (Service Hosting)。在我们的WCF应用服务程序中,通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主 (寄宿进程为Hosting.exe)。客户端通过一个WindowsFrom应用程序(进程为WinClient.exe)去访问WCF应用服务实现数据查询功能。接下来,我们就一步一步来学习如何创建这样的一个WCF应用。
第一步:创建SCF.WcfService解决方案
通过Visual Studio 2015创建一个名为“SCF.WcfService”空白的解决方案,添加如下五个项目。项目的类型、承载的功能和相互引用关系如下,整个项目在Visual Studio 2015中的结构如下图所示。
SCF.WcfService的项目结构
- SCF.WcfService:一个类库项目,提供对WCF服务的实现。引用关系见下图。
- Hosting:一个控制台(Console)应用,实现对定义在SCF.WcfServices项目中的服务的寄宿。引用关系见下图。
- SCF.Model:一个对象实体项目,实现对数据库中的表结构进行实体对象构建。
- WinClient:一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。引用关系见下图。
- SCF.Common:SCF. WcfService解决方案中公共使用的类
第二步:创建WCF服务协定
WCF采用基于接口(MSDN上翻译为:服务协定)的交互方式实现了服务功能,以及客户端和服务端之间的松耦合。WCF包含五种类型的协定:服务协定、操作协定、消息协定、错误协定和数据协定。
从功能上讲,服务协定将多个相关的操作联系在一起,组成单个功能单元。协定可以定义服务级设置,如服务的命名空间、对应的回调协定以及其他此类设置,以及各种操作。
从消息交换的角度来讲,服务协定则定义了基于服务调用的消息交换过程中, 请求消息和回复消息的结构,以及采用的消息交换模式。
从使用编程语言的角度来讲,协定是通过所选的编程语言创建一个接口,然后将 ServiceContractAttribute 属性应用于该接口。通过实现该接口,可生成实际的服务代码。
我们通过接口的形式定义服务协定。通过下面的代码,将接口IBookService定义成服务协定。WCF广泛采用基于自定义特性(Custom Attribtue)的声明式编程模式,我们通过在接口上应用System.ServiceModel.ServiceContractAttribute特性将一个接口定义成服务协定。在应用ServiceContractAttribute特性的同时,还可以指定服务协定的名称和命名空间。
通过应用ServiceContractAttribute特性将接口定义成服务协定之后,接口的方法成员并不能自动成为服务的操作。在此方面,WCF采用的是显式选择(Explicit Opt-in)的策略:我们须要在相应的操作方法上面显式地应用OperationContractAttribute特性。
在SCF.WcfService项目中添加一个IBookService.cs文件,具体代码如下。
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace SCF.WcfService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBookService”。 [ServiceContract] public interface IBookService { [OperationContract] string GetBook(string Id); } }
第三步:实现WCF服务协定
当服务协定成功创建时,我们需要通过实现服务协定来创建具体的WCF服务应用。在SCF.WcfServices项目中添加一个BookService.cs文件,此文件用来实现服务协定接口IBookService,实现所有的服务操作。BookService.cs中的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Data.Entity; using SCF.Model; using SCF.Common; namespace SCF.WcfService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookService”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookService.svc 或 BookService.svc.cs,然后开始调试。 public class BookService : IBookService { public string GetBook(string Id) { int bookId = Convert.ToInt32(Id); Books book= SetBook(bookId); string xml=XMLHelper.ToXML<Books>(book); return xml; } public Books SetBook(int Id) { Books book = new Books(); book.BookID = Id; book.AuthorID = 1; book.Category = "IBM"; book.Price = 9.99M; book.Numberofcopies = 22; book.Name = "DB 2"; book.PublishDate = new DateTime(1986, 2, 23); return book; } } }