1、WCF 开发实战系列教程1:创建第一个 WCF 服务在这个实战中我们将使用 DataContract,ServiceContract 来构建 WCF 服务,并使用VS2008 内置的“WCFSVCHost”运行我们创建的 WCF 服务,并使用“WCF 测试客户端”来测试我们创建的服务。在此 WCF 服务中我们将建立一个关于 Book 的服务,并实现对 Book 的添加、删除和检索操作。第一步:创建“WCF 服务库”“文件(F)”-“新建项目(P).”打开新建项目对话框。在左侧的“ 项目类型”中选择“WCF”,然后再在右侧的“模板” 中选择“WCF 服务库”。在下面的“名称 ”文本框中,填写我们
2、要创建的 WCF 服务库的项目名称 “Services”。图 1点击确定,会创建出我们的 WCF 服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和 “Service.cs”。图 2这两个类文件是两个 WCF 示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。第二步:创建 Book 实体类在“ 解决方案窗口” 中,我们右击 Services 项目名,选择“添加”,再单击“类”图 3在弹出的“添加新项 ”窗口中,选择 “类”,并在“名称” 文本框中写入项名称“Book.cs”。图 4第三步:为 Book 实体类编写代码using System;using Sy
3、stem.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;namespace ServicesDataContractpublic class BookDataMemberpublic string BookNO;DataMemberpublic string BookName;DataMemberpublic decimal BookPrice;为了保证此类在 WCF 调用中能够被序列化,我们在 Book 类上面加入DataContract 标签,在每个需要序
4、列化的成员变量上加入DataMember标签。这两个标签在使用的进候需要导入 using System.Runtime.Serialization 命名空间。到此为至,我们创建完了需要在服务中传输的复杂的数据类型 Book。第四步:创建服务接口创建服务接口,声明对外发布的类和方法。在“ 解决方案窗口” 中,我们右击 Services 项目名,选择“添加”,再单击“类”图 3在弹出的“添加新项 ”窗口中,选择 “类”,并在“名称” 文本框中写入项名称“IBookService.cs” 。图 5在此类文件中我们编写服务接口,代码如下:using System;using System.Collec
5、tions.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace ServicesServiceContractpublic interface IBookServiceOperationContractvoid AddBooks(Book book);OperationContractList GetAllBooks();OperationContractvoid RemoveBook(string id);在 IBookService 接口上面,我们定义了 ServiceContrac
6、t标签,此标签代表此接口及实现此接口的类都是对外发布的 Service 类,在每个需要对外发布的方法上都加上OperationContract标签,以使外部可以访问到此方法。ServiceContract和OperationContract这两个标签需要导入 using System.ServiceModel命名空间。第五步:创建实现服务接口的类实现我们上面声明的服务接口,实现对 Book 的添加、删除和检索的具体功能。在“ 解决方案窗口” 中,我们右击 Services 项目名,选择“添加”,再单击“类”图 3在弹出的“添加新项 ”窗口中,选择 “类”,并在“名称” 文本框中写入项名称“Bo
7、okService.cs”。图 6在此类文件中编写代码实现 IBookService.cs 服务接口。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace ServicesServiceBehavior(InstanceContextMode=InstanceContextMode.Single)public class BookService : IBookServiceList _Books = new Lis
8、t();public void AddBooks(Book book)book.BookNO = Guid.NewGuid().ToString();_Books.Add(book);public List GetAllBooks()return _Books;public void RemoveBook(string id)Book book = _Books.Find(p = p.BookNO = id);_Books.Remove(book);此类是对 IBookService 接口的具体实现,在此类的上面我们声明了ServiceBehavior(InstanceContextMode=
9、InstanceContextMode.Single)标签,此标签代表这个类采用 SingleTone(单类模式)来生成对象。使用ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)接口需要导入using System.ServiceModel;命名空间。第六步:配置 WCF 服务到目前为至,我们建立好了 WCF 服务,那我们如何让 WCFSVCHost(WCF 服务主机) 理解我们编写的服务类,并能够运行我们编写的服务呢。这需要我们在 App.Config 里面注册一下我们的 WCF 服务。代码如下:这么多东西谁能记得
10、下?!没关系,VS2008 为我们提供了可视化的操作界面。在 Services 项目中右击“App.Config”配置文件,在弹出的右键菜单中选择“编辑 WCF 配置”。图 7弹出界面如下:图 8在此界面中暴露两个对外的终结点(外部可以访问到的类或接口),其中下面一个是元数据终结点,用来向外提供服务信息的终结点。而另一个(即上面的终结点),是向外公布我们编写的ServiceContract 的类,但我们可以看到它的 Contract 还是我们在第一步中删掉的 Services.IService1 这个终结点。不仅如此,在右侧的服务中还依旧是我们在第一步中删除的 Services.Service
11、1 服务。这说明虽然在第一步中我们删除了那两个自动生成的类文件,但配置文件中仍没有删除这两个类文件的配置信息。下面我们把它们改变一下。单击左侧的“服务 ”-“Services.Service1”在右侧的 Name,弹出 “服务类型浏览器”对话框,在此类型中我们找到此 WCF 服务项目编译出来的 Services.dll 文件,双击它就可以出现此服务中的对外公布的服务,点击选中它单击确定。图 9这样我们就可以把对外公司的服务改变为我们刚编写的服务了。然后,我们展开左侧“服务”-“Services.BookService”-“终结点” ,单击第一个“空名称”,从右边的“终结点属性 ”中的 Cont
12、ract 中我们可以看到,这里的 Contract 仍然用的是Services.IService1。图 10那我们按照上面的做法,找到此 WCF 服务项目编译出来的 Services.dll,双击它找到里面对应的 ServiceContract 点击确定就可以了。图 11点击菜单“文件 ”-“保存”就可以把我们对 App.Config 的修改保存回配置文件了。OK,现在我们对 WCF 的配置算是完成了第七步:运行 WCF 进行测试。在 VS2008 中为我们提供了测试 WCF 的工具,按 F5 启动 WCF 会出现两个东西一个是在右下角的托盘图标中会出现 WCFSVCHost(WCF 服务主机
13、),它为我们在开发时候提供了一个运行 WCF 的服务器,用来为测试客户端提供 WCF 服务。图 12另一个是 “WCF 测试客户端 ”图 13“测试客户端” 从 WcfSVCHost 中取得 WCF 服务的元数据,解析为右侧的“服务结构树” ,从这里面我们可以看到此 WCF 服务为我们提供了一个服务契约“IBookService”,此服务契约中对外提供了三个可调用的方法。双击 AddBooks()方法,我们可以从右面输入相关的数据然后点击 “调用”,就可以把数据送给 WCF 服务器,去调用对应的方法了。图 14双击 GetAllBooks 方法,我们可以查看添加的书的信息图 15双击 Remo
14、veBoo()方法就可以把书删除图 162: 使用 IIS 发布 WCF 服务上一篇中,我们创建了一个简单的 WCF 服务,在测试的时候,我们使用 VS2008 自带的 WCFSVCHost(WCF 服务主机)发布 WCF 服务,以便进行测试。这种 VS2008 内置的WCFSVCHost 只适用于开发人员测试的使用,能进行 WCF 服务部署。这一篇文章中我们来看一下如何在 IIS 中部发布我们上一篇中做好的 WCF 服务。第一步:打开我们上一篇文章中建立的 WCF 服务项目。图1第二步:新建 WCF 服务站点。 在解决方案上右击,选择 “添加”-“新建网站” ,打开新建网站对话框。在“添加新
15、网站” 对话框中,我们选择 “WCF 服务 ”,并把网站的名子命名为“BookServiceHost”图2建立起来的新的 WCF 服务站点的结果如下,其中在 App_Code 文件中自动为我们生成两个类文件:IService.cs 和 Service.cs。这两个文件对我们来说没有用,我们删掉。图3第三步:在刚刚创建的 WCF 服务站点上添加对 WCF 服务库项目 -Services 项目的引用。图4第四步:配置 Service.svc 文件。双击 Service.svc 文件,我们可以看到它的声明指示如下:由于在第二步中我们已经把 IService.cs 和 Service.cs 两个文件已
16、经删除了,所以这里的声明指示内容修改一下,让这个 Service.svc 文件的后台代码指向我们上次创建的 WCF 服务库项目-Services 项目中的类,改后的代码如下:我们把其中的 Service 属性指定为 Services 命名空间下的 BookService 类,并把CodeBehind 属性删去了。第五步:配置此 WCF 服务站点与 WCF 服务库项目之间的类的对应。虽然在第三步中我们添加了对 Services 项目的引用,并且在第四步中修改了 Service.svc 的类的对应,但此时我们的 WCF 服务站点并不能把 WCF 服务库中的服务和终结点发布出来,还需要我们对 web
17、.config 进行一系列的配置工作。在 web.config 上右击选择“编辑 WCF 配置”图 5在弹出的服务配置窗口中,把 Service 服务指定到 WCF 服务库的 Services.dll 中的Services.BookService 服务类上。图 6再把其中的一个对外终结点的 Contract 设为 WCF 服务库的 Services.dll 中的Services.IBookService 服务契约上。图 7第六步:试着再添加一个通信的终结点。这一步是可选的,我们再为此 WCF 服务站点添加一个终结点,A=basic B=basicHttpBinding C=Services.I
18、BookService图 8下面我们将试着使用不同的终结点与 WCF 服务进行交互,查看运行情况。当我们使用 IIS5 或 IIS6 发布 WCF 服务的时候一般只创建 Http 绑定的终结点,而不能创建使用 TCP 绑定、管道绑定的终结点。第七步:测试运行 WCF 服务站点。在 Service.svc 上右击,选择“ 在浏览器中查看”,在 IE 中运行此服务。图 9由此我们看到我们可以在 ASP.NET Development Server 中发布我们的 WCF 服务了。第八步:在 IIS 布署此 WCF 服务站点。在 IIS 建立 Web 应用程,指向我们的 WCF 服务站点所在的目录。然
19、后在 IIS 运行我们发布的 WCF 服务图 10从上图中我们看到发布的站点中不再包含有端口号。到此为至我们在 IIS 中发布 WCF 服务成功。下面我们在 WCF 测试客户端调用我们刚刚在 IIS 中发布的 WCF 服务第九点:在 VS2008 命令窗口中输入以下代码运行 WCF 测试客户端x:.wcftestclient http:/localhost/TestWCFService/Service.svc弹出测试窗口如下:图 11我们可以看到发布的服务中有两个终结点:这两个终结点的传输方式不同,但提供的方法是相同的。我们通过第一个终结点的 AddBooks()方法添加三个对象。图 12再通过第二个终结点的 GetAllBooks()方法取得所有对象的信息。图 13运行完全没问题。3:自运行 WCF 服务