zoukankan      html  css  js  c++  java
  • WCF开发实战系列一:创建第一个WCF服务

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

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

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

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

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

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

    clip_image008
    《图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项目名,选择“添加”,再单击“类”

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

    clip_image010
    《图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项目名,选择“添加”,再单击“类”

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

    clip_image011
    《图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配置

    clip_image012
    《图7》
    弹出界面如下:

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

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

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

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

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

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

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

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

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

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

    clip_image021
    图《16》

    clip_image022

  • 相关阅读:
    Linux各个目录的作用及内容
    发现未授权登录用户怎么办
    开启GodMode
    通过域名方式决定使用哪个数据库的方式分享
    openerp-server.conf 中配置 dbfilter 参数无效的解决办法
    OpenERP7.0 忘记admin管理员密码解决办法
    DEB方式在UBUNTU安装ODOO 8.0
    解决apt-get的E: Could not get lock /var/lib/dpkg/lock方法
    Ubuntu 11.04 (Natty) 已经停止支持 但可以使用old-releases源了
    How to get the url of a page in OpenERP?
  • 原文地址:https://www.cnblogs.com/sjqq/p/6793098.html
Copyright © 2011-2022 走看看