WCF的简单

WCF的学习之旅

一、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

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

            运行结果如下:

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

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

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

 
 
分类: .Net
标签: WCF

WCF的简单的更多相关文章

  1. SharePoint 2013 调用WCF服务简单示例

    内容比较简单,主要记录自己使用SharePoint 2013WCF服务遇到的小问题和小经验,分享给大家,希望能够给需要的人有所帮助.好吧,进入正题! 第一部分 SharePoint 2013调用自带W ...

  2. 使用TT模板+mvc+wcf实现简单查询

    今天是除夕,小编的这篇博客是掐着点儿发的,在此,祝各位小伙伴新年快乐,身体健康,万事如意:喜从天降,欣喜若狂:喜气盈门,好事成双:好人好运,金玉满堂:神采飞扬,如愿以偿,财源滚滚来,福如东海长:伴随着 ...

  3. WCF通信简单学习实例

    最近在学习WCF通信,自己简单做个实例分享一下,环境是VS2015,使用的项目都是WPF的项目,其实大家用Winform或者Web项目也可以,都可以用的. 一.服务器端 1.创建WCF服务 服务名为W ...

  4. 利用WCF创建简单的RESTFul Service

    1):用VS2013创建一个WCF的工程,如下图所示: 2):我们来看一下默认状态下的config文件内容,这里的内容我们会再后续的步骤中进行修改 <?xml version="1.0 ...

  5. WCF创建简单程序

    1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc,当然你也可以直接 ...

  6. WCF的简单使用

    WCF简单介绍 WCF(windows communication foundation)是微软推出的数据通信的统一编程模型,在WCF有四个主要的关键点: abcd Address(地址):定义服务的 ...

  7. WCF最简单的一次通信(有部分參考,多爲原創)

    不廢話,直接上乾貨 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.msdn的wcf教程还要求输 ...

  8. WCF客户端简单动态配置服务地址

    本来想实现WCF服务无论放到哪个机器上,我的客户端都不需要重新编译,只需要配置一个服务的地址即可.各种百度找到了很多解决方案.但都比较繁琐,(只要因为个人小菜看不懂太多的代码)我对WCF内部机制还不了 ...

  9. WCF入门简单教程(图文) VS2010版

    在这个例子中我们将使用VS 2010 创建一个WCF服务,其中会了解 [DataContract] [ServiceContract] 等特性.  内置的 WCFSVCHost ,并使用“WCF测试客 ...

随机推荐

  1. ReactJS.NET 开发

    初探ReactJS.NET 开发   ReactJS通常也被称为"React",是一个刚刚在这场游戏中登场的新手.它由Facebook创建,并在2013年首次发布.Facebook ...

  2. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  3. linux_ubuntu12.04 安装 svn

    sudo apt-get install subversion sudo mkdir /home/svn sudo svnadmin create /home/svn/repository cd /h ...

  4. swift 注意事项 (十六) —— 可选链

    可选链(Optional Chaining) 我们都知道"可选型"是什么.那么可选链又是什么,举个样例解释一下: struct MyName{      var name } st ...

  5. 【百度地图API】如何激发手机的高分辨率

    原文:[百度地图API]如何激发手机的高分辨率 摘要:不少用户使用百度地图API开发在移动浏览器上的应用时发现,明明自己的手机是高分辨率的,但是显示出来的地图却比较模糊,甚至“看不清楚”.接下来,我们 ...

  6. hdu2203 KMP水的问题

    两种方法     首先是纯KMP #include<stdio.h> #include<string.h> #include<iostream> using nam ...

  7. CentOS修改用户密码方法

    CentOS修改用户密码方法 CentOS修改用户密码方法 1. 普通用户 a. 获取超级用户root权限 命令:su或者su -或者su - root b. passwd 用户名 2. 超级用户 a ...

  8. $.each()遍历Json对象

    1.遍历JavaScript数组对象: var json = [ //中括号起始 {"id":"1","tagName":"app ...

  9. 分析Cocos2d-x横版ACT手游源 2、server场景

    仍然一样 直接在代码 资源 下一个 上传 你可以看到自己 NFServerChangeLayer.h </pre><pre name="code" class=& ...

  10. Web API-路由(一)

    这一篇文章描述了ASP.NET API如何将HTTP请求路由到控制器. 如果你熟悉ASP.NET MVC,Web API路由和MVC路由非常相似,主要的不同地方是Web API使用HTTP方法,而不是 ...