转 http://www.cnblogs.com/poissonnotes/archive/2010/08/28/1811064.html

在这个实战中我们将使用DataContract,ServiceContract来构建WCF服务,并使用VS2008内置的“WCFSVCHost”运行我们创建的WCF服务,并使用“WCF测试客户端”来测试我们创建的服务。
在此WCF服务中我们将建立一个关于Book的服务,并实现对Book的添加、删除和检索操作。

第一步:创建“WCF服务库
“文件(F)”->“新建项目(P)...”打开新建项目对话框。在左侧的“项目类型”中选择“WCF”,然后再在右侧的“模板”中选择“WCF服务库”。
在下面的“名称”文本框中,填写我们要创建的WCF服务库的项目名称“Services”。


《图1》
点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。

《图2》
这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。

第二步:创建Book实体类
在“解决方案窗口”中,我们右击Services项目名,选择“添加”,再单击“类”


《图3》
在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“Book.cs”。


《图4》

第三步:为Book实体类编写代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
 
namespace Services
{
[DataContract]
    public class Book
    {
        [DataMember]
        public string BookNO;
        [DataMember]
        public string BookName;
        [DataMember]
        public decimal BookPrice;
    }
}
 

为了保证此类在WCF调用中能够被序列化,我们在Book类上面加入[DataContract]标签,在每个需要序列化的成员变量上加入[DataMember]标签。这两个标签在使用的进候需要导入using System.Runtime.Serialization命名空间。
到此为至,我们创建完了需要在服务中传输的复杂的数据类型Book。

第四步:创建服务接口
创建服务接口,声明对外发布的类和方法。
在“解决方案窗口”中,我们右击Services项目名,选择“添加”,再单击“类”


《图3》
在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“IBookService.cs”。


《图5》
在此类文件中我们编写服务接口,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
 
namespace Services
{
    [ServiceContract]
    public interface IBookService
    {
        [OperationContract]
        void AddBooks(Book book);
 
        [OperationContract]
        List<Book> GetAllBooks();
 
        [OperationContract]
        void RemoveBook(string id);
    }
}
 

在IBookService接口上面,我们定义了[ServiceContract]标签,此标签代表此接口及实现此接口的类都是对外发布的Service类,在每个需要对外发布的方法上都加上[OperationContract]标签,以使外部可以访问到此方法。
[ServiceContract]和[OperationContract]这两个标签需要导入using System.ServiceModel命名空间。

第五步:创建实现服务接口的类
实现我们上面声明的服务接口,实现对Book的添加、删除和检索的具体功能。
在“解决方案窗口”中,我们右击Services项目名,选择“添加”,再单击“类”


《图3》
在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“BookService.cs”。


《图6》
在此类文件中编写代码实现IBookService.cs服务接口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
 
namespace Services
{
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    public class BookService : IBookService
    {
        List<Book> _Books = new List<Book>();
        public void AddBooks(Book book)
        {
            book.BookNO = Guid.NewGuid().ToString();
            _Books.Add(book);
        }
 
        public List<Book> GetAllBooks()
        {
            return _Books;
        }
 
        public void RemoveBook(string id)
        {
            Book book = _Books.Find(p => p.BookNO == id);
            _Books.Remove(book);
        }
    }
}
 

此类是对IBookService接口的具体实现,在此类的上面我们声明了[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]标签,此标签代表这个类采用SingleTone(单类模式)来生成对象。
使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]接口需要导入using System.ServiceModel;命名空间。

第六步:配置WCF服务
到目前为至,我们建立好了WCF服务,那我们如何让WCFSVCHost(WCF服务主机)理解我们编写的服务类,并能够运行我们编写的服务呢。这需要我们在App.Config里面注册一下我们的WCF服务。
代码如下:

<system.serviceModel>
    <services>
      <service behaviorConfiguration="Services.Service1Behavior" name="Services.BookService">
        <endpoint address="" binding="wsHttpBinding" contract="Services.IBookService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/Services/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Services.Service1Behavior">
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- 要接收故障异常详细信息以进行调试, 
          请将下值设置为 true。在部署前 
            设置为 false 以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
</system.serviceModel>
 

这么多东西谁能记得下?!!!
没关系,VS2008为我们提供了可视化的操作界面。
Services项目中右击“App.Config”配置文件,在弹出的右键菜单中选择编辑WCF配置


《图7》
弹出界面如下:


《图8》
在此界面中暴露两个对外的终结点(外部可以访问到的类或接口),其中下面一个是元数据终结点,用来向外提供服务信息的终结点。而另一个(即上面的终结点),是向外公布我们编写的[ServiceContract]的类,但我们可以看到它的Contract还是我们在第一步中删掉的Services.IService1这个终结点。不仅如此,在右侧的服务中还依旧是我们在第一步中删除的Services.Service1服务。这说明虽然在第一步中我们删除了那两个自动生成的类文件,但配置文件中仍没有删除这两个类文件的配置信息。
下面我们把它们改变一下。
单击左侧的“服务”-“Services.Service1”在右侧的Name,弹出“服务类型浏览器”对话框,在此类型中我们找到此WCF服务项目编译出来的Services.dll文件,双击它就可以出现此服务中的对外公布的服务,点击选中它单击确定。


《图9》
这样我们就可以把对外公司的服务改变为我们刚编写的服务了。
然后,我们展开左侧“服务”->“Services.BookService”->“终结点”,单击第一个“空名称”,从右边的“终结点属性”中的Contract中我们可以看到,这里的Contract仍然用的是Services.IService1。


《图10》
那我们按照上面的做法,找到此WCF服务项目编译出来的Services.dll,双击它找到里面对应的ServiceContract点击确定就可以了。


《图11》
点击菜单“文件”-“保存”就可以把我们对App.Config的修改保存回配置文件了。

OK,现在我们对WCF的配置算是完成了

第七步:运行WCF进行测试。
在VS2008中为我们提供了测试WCF的工具,按F5启动WCF会出现两个东西
一个是在右下角的托盘图标中会出现WCFSVCHost(WCF服务主机),它为我们在开发时候提供了一个运行WCF的服务器,用来为测试客户端提供WCF服务。


图《12》
另一个是“WCF测试客户端”


图《13》
    “测试客户端”从WcfSVCHost中取得WCF服务的元数据,解析为右侧的“服务结构树”,从这里面我们可以看到此WCF服务为我们提供了一个服务契约“IBookService”,此服务契约中对外提供了三个可调用的方法。
双击AddBooks()方法,我们可以从右面输入相关的数据然后点击“调用”,就可以把数据送给WCF服务器,去调用对应的方法了。


图《14》
双击GetAllBooks方法,我们可以查看添加的书的信息


图《15》
双击RemoveBoo()方法就可以把书删除


图《16》


图《17》

WCF开发实战系列一:创建第一个WCF服务 转的更多相关文章

  1. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...

  2. WCF开发实战系列一:创建第一个WCF服务

    WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...

  3. WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...

  4. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  5. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  6. WCF开发实战系列二:使用IIS发布WCF服务 转

    转 http://www.cnblogs.com/poissonnotes/archive/2010/08/28/1811141.html 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们 ...

  7. WCF学习系列一_创建第一个WCF服务

    原创作者:灰灰虫的家http://hi.baidu.com/grayworm WCF开发实战系列一:创建第一个WCF服务 在这个实战中我们将使用DataContract,ServiceContract ...

  8. Windows Azure入门教学系列 (一): 创建第一个WebRole程序

    原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言 ...

  9. JAVA card 应用开发(一) 创建第一个APPLET

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/freudlv/article/details/26499817 本文讲述在Eclipse环境下.怎样 ...

随机推荐

  1. JOISC 2014 邮戳拉力赛(基础DP)

    题意 https://loj.ac/problem/2878 思路 真的神仙题,想到就很好写,想不到就写不出来. 肯定只能一个一个邮戳按顺序分析.首先,将取一枚邮戳的路径分为四种: 上行 \(\rig ...

  2. Linux命令之du命令

    du命令 显示文件或目录所占用的磁盘空间. 命令格式: du [option] 文件/目录 -h 输出文件系统分区使用的情况,例如:10KB,10MB,10GB等 -s 显示文件或整个目录的大小,默认 ...

  3. 总结react native 事件机制

    React 事件机制 一个组件的所有事件会使用统一的事件监听器,绑定到组件的最外层,那么如何使用? bind方法,绑定并且可以传递参数 <TouchableOpacity onPress={th ...

  4. sql存储过程基本语法

    一.定义变量 --简单赋值 declare @a int print @a --使用select语句赋值 declare @user1 nvarchar() select @user1='张三' pr ...

  5. python中关于列表和元祖的基础知识

    一,列表 1)定义: []内以逗号分隔,按照索引,存放各种数据类型,每一个位置代表一个元素 2)特性: 1 可存放多个值 2 按照从左到右的顺序定义列表元素,下标为零开始顺序访问,有序 3可修改指定索 ...

  6. 性能测试 Performance Test Report

    时间隔了很久,两年左右了吧,最近打开原来的测试报告,测试数据还是很漂亮的.TPS比我记忆中的要高很多. 数据中有些是定死了的(当时的要求),并发不是计算的,是用几个值跑起来试试看的.因为后期我们会用S ...

  7. Xcode打包上传遇到的坑

    1.安装测试包的时候提示APIInternalError ①是否增加了测试设备的UUID ②是否使用adhoc证书打包 2.打包错误:error: couldn't remove '/Users/xx ...

  8. JAVA基础知识总结:十六

    一.File类 主要用于文件操作 对存储在磁盘上的文件和目录的抽取和封装 二.IO流 1.概念 File类只能创建或者修改文件或者文件夹的层级结构,如果要访问文件中的内容的话,就需要用到IO流(Inp ...

  9. Angular 学习笔记 Material

    以后都不会写 0 到 1 的学习记入了,因为官网已经写得很好了. 这里只写一些遇到的坑或则概念和需要注意的事情. Material Table 1. ng-content 无法传递 CdkColumn ...

  10. PHP数组排序函数有哪些

    PHP数组排序函数有哪些 一.总结 一句话总结:其实也就是是否保持索引,对键排序还是对值排序,除了sort,rsort.shuffle,usort外,都是保持索引的 是否保持索引 键排序 值排序 除了 ...