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 = ;

            book.Category = "IBM";

            book.Price = 9.99M;

            book.Numberofcopies = ;

            book.Name = "DB 2";

            book.PublishDate = new DateTime(, , );

            return book;

        }

    }

}

WCF学习之旅——第一个WCF示例(一)的更多相关文章

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

    第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...

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

    第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...

  3. WCF学习之旅—第三个示例之五(三十一)

       上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九) WCF学习 ...

  4. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  5. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  6. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  7. WCF学习笔记——Day1:一个WCF demo

    Visual Studio2017,使用IIS托管.文中涉及一些WCF的基本概念,e.g.服务契约.托管等.可以先阅读<WCF服务编程>第一章. 1.新建一个WCF服务库(WCF Serv ...

  8. WCF学习之旅—第三个示例之一(二十七)

    一.前言 通过前面二十几个章节的学习,我们知道了什么是WCF:WCF中的A.B.C:WCF的传输模式:WCF的寄宿方式:WCF的异常处理.本文综合应用以上知识点,一步一步写一个小的WCF应用程序——书 ...

  9. WCF学习--我的第一个WCF例子

    Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口. 通信双方的沟通方式,由合约来订定.通信双方所 ...

随机推荐

  1. Xcode 8 Simulator Stop Logging too much info

    按照以下内容设置即可:

  2. 如果做好测试PM【转载】

    本文来源于:https://yq.aliyun.com/articles/14578?spm=5176.100238.yqhn2.14.Lcie4Y   摘要今年整体带了几个项目.我本人不是专业的PM ...

  3. files list file for package 'xxx' is missing final newline

    #!/usr/bin/python # 8th November, 2009 # update manager failed, giving me the error: # 'files list f ...

  4. Windows使用总结

    虚拟桌面快捷键: 新建虚拟桌面 Control+Win+D 切换虚拟桌面 Control+Win+左/右方向键 关闭虚拟桌面 Control+Win+F4 显示虚拟桌面列表 Win+Tab  

  5. python基础06 循环

      循环用于重复执行一些程序. for循环  for循环需要预先设定循环的次数n,然后执行隶属于for的语句. 基本构造是 for 元素 in 序列: statement 如: for a in [1 ...

  6. rake deploy ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to解决方法

    需要修改项目中Rakefile文件的内容: 原始内容:system "git push origin #{deploy_branch}" 改后内容:system "git ...

  7. 将库打包到nuget服务器

     前言 由于目前.net core无法引用本地的 assembly ,所以尝试将项目的依赖库打包到nuget服务器.  相关的工具 Nuget Package Explorer 参考文档 dotnet ...

  8. 【专业找水题】状压dp最水题,没有之一

    题目链接 现在代码能力没上升,倒是越来越会找水题了(比例题还水的裸题你值得拥有) 这网站不是针对竞赛的,所以时空限制都很宽松 然后就让我水过去了 对于每个点,包括自己的前m个元素是否取都是一种状态,所 ...

  9. JavaScript读书笔记(一)

    自动类型转换 在JavaScript中,使用 == .=== 和 - 等运算符能够使得类型自动转换. 关于不同类型的值的比较 flase == 0; //true "" == fl ...

  10. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...