WCF基本概念
WCF是基于Windows平台下开发和部署服务的SDK。服务是一组公开的功能集合。
面向服务(Service Orientatio,SO)是一组原则的抽象,
面向服务的应用程序(SOA)将众多服务聚集到一个单一逻辑的应用程序中。
1.服务的执行边界
WCF不允许客户端直接与服务交互,客户端总是使用代理(proxy)将调用转发给服务。
代理公开的操作与服务相同,同时还增加了一些管理代理的方法。代理可以拦截WCF的请求,并增加WCF的价值。
WCF允许客户端跨越执行边界和服务通信。在同一机器中,客户端可以调用同一个应用程序域中的服务,也可以在同一进程中跨应用程序域调用,甚至跨进程调用。
跨越机器边界通信是指客户端可以与服务跨越Internet(互联网)或者Intranet(局域网)交互。
2.地址
每一个服务都有唯一的地址,地址包含两个重要的元素:服务位置和传输协议,
服务位置包含:目标机器名,站点(或者网站),通信端口,管道(或者是队列),以及一个可选的特定路径或URI。
传输协议:Http(s),TCP,IPC,Peer network,MSMQ,Service bus
地址格式:[基地址]/[可选的URI]
基地址格式:[传输协议]://[机器名或域名][:可选端口]
=>[传输协议]://[机器名或域名][:可选端口] /[可选的URI]
eg:http://localhost:8001/MyService
读作:采用Http协议访问localhost机器,MyService服务在8001端口处等待用户的调用。
3.托管
1) IIS 5/6托管
此版本的IIS托管只能使用Http协议,如果是IIS5,还受端口限制,要求所有服务必须使用相同的端口号。服务的基地址必须与.svc文件的地址相同。此托管无法满足Intranet内部的访问。
2) 自托管
由开发组提供和管理宿主进程的生命周期的一种方式。客户端调用自托管的服务时,该服务进程必须先启动。
3) WAS托管
WAS:Window激活服务,新一代Windows系统中通用的托管引擎。
WAS确实是通用的宿主引擎,可以托管网站(实际上IIS7默认使用WAS托管网站),可以方便地托管服务,允许使用任何传输协议,如TCP,IPC,MSMQ等,可以单独安装或者配置WAS,不需要和IIS7一起使用。托管WCF服务需要提供svc文件
4) IIS/WAS里的自定义托管
如果需要直接与宿主交互,WCF提供了一个叫做“宿主工厂”的hook,在svc文件里直接使用Factory标签,可以提供自定义创建宿主的类。
5) Windows Server AppFabric
WAS并不知道托管的是WCF服务还是网站,对WCF服务也不会做什么优化工作。为了处理这个问题,可以安装WAS扩展程序,即Windows Server AppFabric(需要安装IIS7.5及以上),此扩展程序的设计目的就是为WCF和WF提供监控、显示,以及事件跟踪等额外的配置选项。
Windows Server AppFabric在第一个客户端请求到来之前就已经启动服务。
WAS会在第一个客户端请求到来后再启动服务宿主进程。
4.绑定
一个绑定封装了注入传输协议、消息编码、通信模式、可靠性、安全性、事物传播,以及互操作性等相关选项。理想状态下,希望将所有繁杂的基础功能模块从服务代码中解放出来,让服务只需要关注业务逻辑的实现。绑定使得开发者能够基于不同的基础功能模块使用相同的服务模块。单个服务能够支持各个地址上的多个绑定。
WCF定义了五种常用的绑定
1) 基本绑定:BasicHttpBinding。
2) TCP绑定:NetTcpBinding,要求客户端与服务都必须使用WCF。
3) IPC绑定:NetNamePipeBinding,在同一机器通信进行传输,性能最佳,最安全。
4) Web服务(WS)绑定:WSHttpBinding
5) MSMQ绑定:NetMsmqBinding
5.终结点
服务与地址、绑定及契约有关。其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约定义了服务的内容。每一个终结点都包含了这三个元素,而宿主负责公开终结点,从逻辑上讲,终结点相当于服务的接口。
每个服务至少必须公开一个业务终结点,每个终结点有且只能拥有一个服务契约。
默认绑定配置:默认绑定会影响使用此配置文件的应用程序里的所有服务,不需要使用名称,每个绑定类型最多有一个默认绑定。
<netTcpBinding>
<binding transactionFlow=”true” />
</netTcpBinding>
默认终结点
如果服务宿主没有定义终结点,只提供了一个基地址,则WCF将会为服务添加默认的终结点。WCF会为每个基地址、每个契约添加终结点,使用基地址作为服务地址。WCF会根据基地址的scheme来推断绑定类型。WCF也会通过连接绑定和契约名字来命名终结点。
协议映射
<system.serviceModel>
<protocolMapping>
<add scheme=”http” binding=”wsHttpBinding” />
</protocolMapping>
</system.serviceModel>
6.元数据交换
1) 基于HTTP-GET的元数据
基于HTTP-GET交换元数据就是一种服务行为,服务添加此行为就能够自动提供基于HTTP-GET的元数据。
<behavior>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl="MyMexAddress"/>
</behavior>
2) 元数据交换终结点
公开元数据交换终结点,用户只需要指定使用的地址和绑定,并添加服务元数据行为即可,serviceMetaData标签,通常情况下不用为它添加值。
标准终结点:WCF为元数据交换、服务发现、服务通告、工作流和Web分别提供了标准终结点。
<service name="StandardEndPoint.Service1">
<endpoint address="MyService" binding="basicHttpBinding" contract="StandardEndPoint.IService1"></endpoint>
<endpoint kind="mexEndpoint" address="httpmex"></endpoint>
</service>
7.传输会话层
传输会话:它确保了来自一个特定客户端的消息被发送到宿主的相同传输通道上。传输层会话是可选的,它只是绑定配置中的一个设置,它会影响到可靠性、实例管理、错误管理、同步、事物和安全。
TCP和IPC绑定都支持传输会话,basicHttpBinding不具备传输会话,WSHttpBinding绑定通过为每条消息插入唯一的ID识别客户端,客户端每次调用发送该ID来维持传输会话。
传输会话通常会在客户端关闭代理时终止。当客户端强制关闭或者通信错误而断开时,每个传输会话具有一个空闲时间的超时值,默认为10min。
<netTcpBinding>
<binding name="tcpsession">
<reliableSession inactivityTimeout="00:25:00"/>
</binding>
</netTcpBinding>
8.可靠性
WCF与其他面向服务技术之间的最大区别在于传输可靠性和消息可靠性。
传输可靠性:在网络数据包层提供了点对点保证传递,以确保数据包的顺序无误。
消息可靠性:负责处理消息层的可靠性,它提供了端对端担保传递,确保消息的顺序无误。为了实现基于消息的可靠通信,该标准维持了一个传输会话层。
OSI七层结构:
7 应用层
6 表示层
5 会话层
4 传输层
3 网络层
2 数据链路层
1 物理层
NetTcpBinding,WSHttpBinding支持可靠性,默认禁用;支持有序传递,默认启用。
WSDualHttpBinding支持可靠性,默认启用;支持有序传递,默认启用。
NetNamedPipeBinding可靠性固有。
WCF允许开发者只启用可靠性,而不启用有序传递。有序传递依赖于可靠性,如果启用了有序传递却禁用了可靠性,调用就不会按顺序传递。
配置可靠性
<bindings>
<netTcpBinding>
<binding name="reliabletcp">
<reliableSession enabled="true"/>
</binding>
</netTcpBinding>
</bindings>
WCF基本概念的更多相关文章
- 菜鸟学习WCF笔记-概念
背景 WCF这个词语一直不陌生,以前也使用过多次在实际的项目中,但是一直没有时间来做个系统的学习,最近抽点时间,看看 蒋金楠的<WCF全面解析>学习下,顺带做些笔记,如有错误,欢迎各路大神 ...
- WCF回顾一、基本概念和应用场景
一.WCF描述 wcf是一款基于面向服务的架构的通讯框架平台,在分布式框架中得到了广泛使用. wcf入门非常简单,只要花几分钟就能编写一个完整的wcf程序,而实际上WCF是概念非常多的一门技术,需要花 ...
- WCF分布式开发步步为赢(1):WCF分布式框架基础概念
众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...
- WCF入门教程1——WCF简要介绍
什么是WCF Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windo ...
- WCF自定义扩展,以实现aop!
引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx 使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...
- 跟我一起学WCF(4)——第一个WCF程序
一.引言 前面几篇文章分享了.NET 平台下其他几种分布式技术,然而前面几种分布式技术专注于某一特定的领域,并且具有不同编程接口,这使得开发人员需要掌握多个API的使用.基于这样的原因,微软在.NET ...
- WCF探索之旅(一)——入门
背景 对于.NET程序员来说,假设你不知道WCF,那仅仅能说明一点:你还是个菜鸟. 曾经也用.NET做过几个系统,尤其做后面的系统的时候,心里就有点沾沾自喜了! 想着,.NET也就这点东西,我如今也能 ...
- WCF 学习总结1 -- 简单实例
从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术.WCF统一的模型整合了以往的 WebService.Remoting.MSMQ ...
- MSDN Webcast 跟我一起从零开始学WCF系列课程
系列课程 >跟我一起从零开始学WCF系列课程 跟我一起从零开始学WCF系列课程(1):WCF概述 (Level 200) 讲 师:徐长龙 课程简介:从 本堂课开始我们将开启一个新的 ...
随机推荐
- Silverlight中动画的性能浅析
Silverlight中提供了StoryBoard实现动画,可是StoryBoard的性能实在不敢恭维,特别是动画很大的时候,计算机的CPU和内存的狂增,如此一来性能实在太差,在默认的动画效果中动画实 ...
- nginx的rewrite,gzip,反向代理学习笔记
rewrite模块名:ngx_http_rewrite_module默认自动被编译 指令:rewrite regex replacement [flag] regex :正则表达式,用于匹配用户请求的 ...
- 选择两个字段时distinct位置的影响
当选择两个字段时,例如:"select XX1, XX2 from tb; ",那么将distinct放在前一个字段XX1之前和放在后一个字段XX2之前,结果有什么不同呢? 先说结 ...
- (转)Android系统自带Activity样式(@android:style/)
在AndroidManifest.xml文件的activity中配置 1.android:theme="@android:style/Theme" 默认状态,即如果theme这里不 ...
- ASP.NET MVC4学习笔记之Controller激活的扩展
一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...
- 【摘抄】Application.StartupPath和System.Environment.CurrentDirectory的区别
System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...
- 小课堂week14 Google软件测试之道
读<Google软件测试之道> 在IT领域,Google是一面旗帜,是一家非常善于思考善于尝试的公司.随着面临挑战的不断增大,传统的测试开展方式也越来越力不从心,这本书讲述的就是一次完整的 ...
- [terry笔记]IMPDP报错ORA-39083 Object type TYPE failed to create ORA-02304
今天在使用impdp导入的时候(同一数据库中转换schema),遇到了 ORA-39083: Object type TYPE failed to create with error: ORA-023 ...
- VS2013+Qt5.6+VSaddin1.2.5
1 下载Qt(1)Qt安装包http://download.qt.io/official_releases/qt/(2)Qt插件http://ftp.jaist.ac.jp/pub/qtproject ...
- C# 编译JS -Evaluator
忘记哪里转过来的,自己mark一下 //// <summary> /// 动态求值 /// </summary> public class Evaluator { /// &l ...