你的位置:首页 > ASP.net教程

[ASP.net教程]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 (book);      return 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;    }  }}