一、WCF的简单介绍

 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是MS为SOA (Service  Oriented Architecture)战略而设计的一套完整的技术框架。它是一种统一的编程模型,用来为微软平台编写分布式(Distributed)应用。涵盖了之前出现的多种技术,如ASMX,Remoting,MSMQ等等。

优点:

1.整合了多项技术,是MS SOA产品的集大成者。

2.更为简单易用。(它囊括了关于服务的一切,无论是服务的创建,托管,消费和安全保障,还是保护与互通,甚至是提高开发效率)

3.包含了 其他技术的所有优点(统一性,互操作性,可靠性,兼容性)

二、客户端与服务的基本关系

 1、客户端与服务

服务是一组向客户端提供可用功能的端点(Endpoints)。而端点(终结点)则是网络上的一个能将消息送达的资源。

   客户端按照与服务之间的契约(Contract)来格式化消息,并将消息发送给端点来访问端点的功能。服务在端点指定的地址(Address)上监听具有特定格式的送达消息。

  2、 服务的三要素(ABC)

A:Address 意味着在哪里(也含有传输方式信息)

B:Binding 意味着怎么做(与地址的传输方式要匹配)

C:Contract意味着做什么(服务契约)

  3、WCF中的地址   

         •Http(basic,WS*)
         •Tcp  
         •Peer netWork(对等网)
         •IPC(基于命名管道的内部进程通信)
         •MSMQ

          

    4、元数据交换     

WCF有两种方式可以发布自己的元数据:

1.基于HTTP-GET协议提供元数据

2.使用MEX终结点

 5、WCF体系架构

三、WCF契约

a).服务契约(SerciceContract)

公布服务的功能。操作契约( OperationContract )则负责在方法级别公开。

b).数据契约(DataContract)

对传递的类对象进行XSD(XML Schema Definitions)定义,以便对其成员进行序列化。

c).消息契约(MessageContract)

自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。

d).错误契约(FaultContract)

自定义错误异常的处理方式。

四、绑定   

就是预先配置好的信道栈,它代表了客户端和服务器之间线路级别上的约定。每个绑定都会指定通信所用的传输、编码及协议。

通过绑定,WCF封装了各种不同通信场所下所使用的配置。

绑定的组成:Name,Namespace,BindingElement

      BindElement:

a)消息编码绑定元素(Message Encoding Binding Element)

b)传输绑定元素(Transport Binding Element)

c)协议绑定元素(Protocal Element):

主要是包含设置事务流控制,安全,会话,排序,升级/帮助器等信息

五、信道与信道栈

 信道:就是WCF应用程序之间传送消息的通道,它负责以一种一致的方式对消息进行整理和传送。信道被用于传输层,协议层及消息解惑。

信道栈:所有各层次的信道一起,组成了信道栈。信道栈就是一个层次的通信栈,专门用于处理消息。

主要包括:传输信道、协议信道

信道模型

a)请求响应模式(Request/Reply)

客户端发送请求后,必须等待回应。

1)同步—请求响应模式

2)异步—请求响应模式

b)单向通信模型(Oneway)

客户端发送请求后,无需等待服务器回复,只需得到一个通知来确认消息已经成功发送即可

c)双工通信(Duplex)

通信双方都是客户端和服务器,双方都可以发送请求并回复消息。

六、行为的分类

a)服务行为

运行于服务级别,能访问所有的端点。主要控制实例化与事务,还用于授权和审计。

b)端点行为

涉及服务端点,适用于对进出服务的消息进行审查和处理。(消息跟踪器)

c)操作行为

涉及操作级别,对于服务操作而说,他们适用于序列化、事务流和参数处理。(参数检验器)

七、并发与实例化

WCF中控制并发的行为

   1.实例上下文模式(InstanceContextMode)

a)Single:一个服务类的实例处理所有入站请求,这实现为单例(Singleton).

b)PerCall:为每个入站请求创建一个服务类的实例。

c)PerSession:为每个客户端会话创建一个服务类的实例。(默认方式)

 2.并发模式(ConcurrencyMode)

a)Single:在同一时刻只有一个线程访问服务类,这是最安全的设置,因为不用担心线程安全问题。

b)Reentrant:在同一时刻只有一个线程访问类,但该线程能暂时离开服务类,稍后回来并继续访问。

c)Multiple:多个线程能并发访问服务类

八、托管

服务并不能单独存在,必须寄存在宿主中。服务宿主(Service host)是一个负责WCF服务的生命周期(LiftTime)和上下文(Context)的操作系统进程。

负责启动和停止WCF服务,并提供了一些控制服务的基本管理功能。

托管的方式:

1.控制台程序/WINDOWS程序(自托管)

优点:开发简单

缺点:在项目中应用并不常见,通常只用在测试阶段

   2.IIS

优点:宿主进程可以在客户端提交第一次请求的时候自动启动,还可以借助IIS管理宿主进程的生命周期。

缺点:只能支持HTTP协议。

basicHttpBinding

wsHttpBinding

wsDualHttpBinding

3.Windows服务(自托管)

优点:随系统一同启动

4、IIS托管浏览元数据效果图 

九、客户端

客户端引用服务的方法:

1.使用svcutil.exe工具(生成ServiceBase)

2.使用 Add Service Reference(控制台程序中没有) (生成ServiceBase)

3.使用信道工厂channelFactory或channelFactory<T>

4. 手工建立(手工添加继承ServiceBase)

客户端需要哪些文件:

1.契约接口

2.配置文件(非必须,可编码实现同样功能)

3.数据契约实现的类与系统支持的数据类型

  十、服务建立

 步骤一:构建整个解决方案

 Contracts:类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(WCF框架的绝大部分实现和API定义在该程序集中);
           Services:类库项目,对WCF服务的实现。定义在该项目中的所有WCF服务实现了定义在Contracts中相应的服务契约,所以Services具有对Contracts项目的引用
           Hosting:控制台应用,实现对定义在Services项目中的服务的寄宿,该项目须要同时引用Contracts和Services两个项目和System.ServiceMode程序集;
           Client:一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。

      步骤二:创建服务契约

          注意:需要引用System.ServiceModel.dll

添加[ServiceContract]与[OperationContract]特性

           

      步骤三:创建服务      

注意:需要引用System.ServiceModel.dll

引用服务契约所在的dll

          

  步骤四:通过自我寄宿的方式寄宿服务

         注意:需要引用System.ServiceModel.dll

引用服务契约所在的dll

引用服务所在的dll

新建项,选择应用程序配置文件,文件名App.config保持不变。
         修改app.config内容如下:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <system.serviceModel>
  4. <services>
  5. <service name="Services.CalculatorService" behaviorConfiguration="behaviorConfiguration">
  6. <host>
  7. <baseAddresses>
  8. <add baseAddress="http://localhost:8013/"/>
  9. </baseAddresses>
  10. </host>
  11. <endpoint address="" binding="basicHttpBinding" contract="Contracts.ICalculator"></endpoint>
  12. </service>
  13. </services>
  14. <behaviors>
  15. <serviceBehaviors>
  16. <behavior name="behaviorConfiguration">
  17. <serviceMetadata httpGetEnabled="true"/>
  18. </behavior>
  19. </serviceBehaviors>
  20. </behaviors>
  21. </system.serviceModel>
  22. </configuration>

      步骤五:创建客户端调用服务

使用微软的svcutil工具CalculatorService服务的客户端代理类,
         通过开始菜单/Microsoft Visual Studio 2010/Visual Studio Tools/Visual Studio 2010命令提示,启动命令环境。
         确认CalculatorService服务已启动
         切换当前路径到解决方案目录:cd G:\Program\WCF\WCFDeom\Client
         输入命令:svcutil http://localhost:8013/?wsdl /o:CalculatorService.cs
         执行成功后,会在解决方案目录下生成两个文件:CalculatorService.cs 和output.config


        中止Host项目的调试,回到Client项目,选择添加 现有项 ,然后选择这两个文件,添加后,将output.config重命名为App.config
        Client项目中添加引用,选择System.ServiceModel
        修改program.cs代码如下:

  步骤六:建立客户端程序

注意:需要引用System.ServiceModel.dll

引用服务契约所在的dll

(这里建立的方式是:信道工厂)

            运行结果如下:

希望能够帮到各位园友们!精彩内容整理中..............

成功路上最心酸的是要耐得住寂寞、熬得住孤独,总有那么一段路是你一个人在走,一个人坚强和勇敢。

人的一生没有过不去的坎,跨坎的源动力在自已。

WCF的学习之旅的更多相关文章

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

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

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

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

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

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

  4. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  5. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  6. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  7. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  8. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

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

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

随机推荐

  1. MySQL数据库的多种备份与多种还原

    一.备份 1.mysqldump 方法备份 mysqldump备份很简单,格式如下: mysqldump -u用户名 -p密码 数据库名> XX.sql 路径 例如: mysqldump -ur ...

  2. ubuntu16.04安装 java JDK8

    安装openjdk1.更新软件包列表: sudo apt-get update 2.安装openjdk-8-jdk: sudo apt-get install openjdk-8-jdk 3.查看ja ...

  3. 02 Django框架基础(APP的创建访问)

    一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...

  4. pandas处理较大数据量级的方法 - chunk,hdf,pkl

    前情提要: 工作原因需要处理一批约30G左右的CSV数据,数据量级不需要hadoop的使用,同时由于办公的本本内存较低的缘故,需要解读取数据时内存不足的原因. 操作流程: 方法与方式:首先是读取数据, ...

  5. python 类的封装/property类型/和对象的绑定与非绑定方法

    目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...

  6. leetcode-6-basic

    解题思路: 这道题真实地反映了我今晚有多脑残=.=只需要从根号N开始向前找,第一个能被N整除的数就是width,然后存到结果就 可以了.因为离根号N越近,width越大,与length的差越小. ve ...

  7. DP刷题记录(长期更新)

    bzoj 2748 一个吉他手,有一个初始音量,有一个音量最大值max. 给定n个音量变化量,从第一个变化量开始,可以选择加上或者减去变化量.途中音量不能低于0,不能超过max. 求最后能达到的最大音 ...

  8. hdu 6312

    Problem Description Alice and Bob are playing a game.The game is played on a set of positive integer ...

  9. 装饰器与lambda

    装饰器 实际上理解装饰器的作用很简单,在看core python相关章节的时候大概就是这种感觉.只是在实际应用的时候,发现自己很难靠直觉决定如何使用装饰器,特别是带参数的装饰器,于是摊开来思考了一番, ...

  10. android:exported属性

    这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互.如果设置为true,则能够被调用或交互,否则不能.设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定 ...