• WCF学习之旅——第一个WCF示例(一)


    WCF学习之旅目录

    WCF学习之旅——第一个WCF示例(一)

    WCF学习之旅——第一个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;
    
            }
    
        }
    
    }
  • 相关阅读:
    昨天是下了一整天的雨,在家里买了一斤肉和恶小白菜吃
    昨天网上感觉好冷,睡在席子上都是感觉打哈欠
    今天是下雨了,看来是要穿长裤上班了
    昨天用的流量有点多60M
    Python常用模块(3)—— shelve、pickle、json、xml、configparser
    Python常用模块(2)—— os、sys、shutil
    Python常用模块(1)—— time、datetime、randrom
    内置函数
    包的导入使用
    模块的导入使用
  • 原文地址:https://www.cnblogs.com/chillsrc/p/5261605.html
Copyright © 2020-2023  润新知