WCF核心技术(学习笔记)

1.基础

1.1为什么选择WCF

REST(Representational(具象派的; 代表性的;) State Transfer)

SOAP(简单对象访问协议)

对协议和消息格式并无要求

支持各种消息交换模式 【Request/Reply,One-way,Duplex】

1.2简介

服务是一组向客户端提供可用功能的(endpoints)端点

(endpoints)端点则是网络上的一个能将消息送达的资源

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

ABC:(address)地址/(binding)绑定/(contract)契约

(address)地址定义的是网络消息送达之处,即端点接收消息之处,客户端必须将消息送到此处。

(binding)绑定定义的是与端点通信的信道(channel).信道是一个所有WCF应用程序传递消息的管道。

(contract)契约定义端点提供的功能或功能集合,对外发布的操作(operation)以及这些操作所要求的消息格式。

1.3实现WCF服务

定义契约 [ServiceContract]
在标准的WSDL(Web Services Description Language)中,[ServiceContract]定义了一个PortType

[OperationContract]
在WSDL中定义的是操作(Operations)和消息(Messages)。

定义端点

System.ServiceModel.ServiceHost

AddServiceEndpoint
(address)地址
(binding)绑定
(contract)契约
Open
ServiceHost.Openf方法一旦被调用,WCF会查找应用程序配置文件(app.config/web.config)中的<ServiceModel>来应用配置数据

在进程中托管服务

1.4实现WCF服务的客户端

首先,定义希望访问的接口,接口定义由客户端和服务共享。C#的定义与XML或者WSDL上有很大的不同,但在语义上是一致的,也就是说它准确描述了访问服务功能的方式/操作名称/参数。 其次,客户端向Channel Factory类传入ABC来创建一个信道工厂实例,以便将来生成信道。

1.5在IIS中托管服务

在IIS中创建一个虚拟应用程序来存放服务;

创建一个SVC文件来定义服务实现;

加入一个包含<system.serviceModel>段的web.config文件

元数据

在WCF中元数据指的是精确描述与服务通信的方法的信息。 服务元数据(service metadata) 服务的ABC(地址/绑定/契约)由元数据所呈现,以便客户端能知晓与服务通信的位置/方式和内容(where/how/what)。

2.契约

2.1 服务契约ServiceContract

服务契约描述服务所实现的功能操作。将.NET类型中的类方法(class method)映射到WSDL中的服务/端口类型以及操作,而服务契约中的操作契约则描述了服务操作,即实现服务功能的函数方法。

2.1.1同步请求-响应操作

2.1.2异步请求-响应操作

2.1.3单向操作  可以通过在[OperationContract] 属性中设置IsOneWay=true修饰符来制定。

2.1.4双工操作

2.1.5单个服务中的多契约与多端点

2.1.6 在wsdl中如何命名操作/类型/行为/命名空间

 

2.2数据契约DataContract

数据契约描述了服务端与客户端通讯时使用的数据结构。数据契约将CLR数据类型映射到XML模式定义(XML Schema Definition),并定义如何对其进行序列化和反序列化。

2.2.1数据类型满足下列条件之一,将会被DataContractSerializer序列化,并在WSDL中发布。

标记有[DataContract]和[DataMember]属性;

标记有[CollectionDataContract]属性;

由IXmlSerializable派生

标记有[Serializable]属性,而成员未被标记[NonSerialized];

标记有[Serializable]属性,并实现了Iserializable接口;

CLR内建基本类型,如int32和string等;

Bytes

array/DateTime/TimeSpan/Guid/Uri/XmlQualifiedName/XmlElement/XmlNode

数组/容器,如List<T>/Dictionary<K,V>/Hashtable等

枚举(Enumerations)

2.2.2DataMenber属性

Name

Order

IsRequired

2.2.3KonwnTyep

用KnownType属性在WSDL中发布其它数据类型,比如一个序列化的派生类被发送到端点,而端点则期望得到序列化的基类。

2.2.4 使用容器

[CollectionDataContract]属性

2.3消息契约MessageContract

消息契约将CLR类型映射成SOAP消息,描述SOAP消息的格式,并影响这些消息的WSDL和XSD定义。消息契约可以精确地控制SOAP信头和信体。

2.3.1 有类型消息
(用户可以指定多个消息头或消息体,让客户端软件的不同层次使用。)

[MessageContract]

[MessageHeader]

[MessageBodyMember]

2.3.2 无类型消息

2.3.3 使用无类型消息的SOAP消息头

WSDL 元素

类型 (Types) 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。

消息(Message) 通信消息的数据结构的抽象类型化定义。

操作(Operation) 对服务中所支持的操作的抽象描述

端口类型(PortType) 对于某个访问入口点类型所支持的操作的抽象集合

绑定(Binding) 是针对特定端口类型定义的操作和消息的具体协议和数据格式。

端口(Port) 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

服务(Service) 相关服务访问点的集合

--错误契约FaultContract

3.信道

定义

信道,就是WCF应用程序之间以一种一致的方式对消息整理和传递的通道 信道被用于传输层/协议层以及消息截获。 传输信道 协议信道

信道栈

所有各层次的信道一起,组成了信道栈。信道栈的功能是将消息转换成一种能在通信线路上传送的格式。 信道栈就是一系列的信道用绑定元素按照一定的配置组合起来。

3.1信道范型

3.1.1单向通信模式 IOutputChannel IInputChannel

3.1.2双工通信模式 IDuplexChannel

3.1.3请求-响应通信模式 IRequestChannel IReplyChannel

3.1.4范型变换 CompositeDupleBindingElement

3.2操作契约与信道范型

3.3信道监听器

binding.BuildChannelLIstener

3.4信道工厂

ChannelFactory<>

3.5ICommunicationObject

接口通常的应用场景是将已有的某个通信对象强制转换成这个接口,以便能够使用接口提供的方法和事件。

4.绑定

绑定就是预先配好的信道栈,代表了客户端和服务契之间线路级别上的约定。

4.1 选择合适的绑定

4.2 .NET应用程序间的跨机通信

netTcpBinding

4.3 .NET应用程序间的本机通信

netNamedPipeBinding

4.4使用基本的Web Service进行通信

basicHttpBinding

4.5使用高级的Web Service进行通信

wsHttpBinding wsDualHttpBinding wsFederationHttpBinding(联邦; 联合会; 同盟; 联盟;)

4.6绑定的性能与可伸缩性的比较

什么是性能问题? 如果你的系统对于一个用户访问还很慢,那就是性能问题; 什么是可伸缩性(可扩展性)问题? 如果你的系统对一个用户来说是快的,但是在用户不断增长的高访问量下就慢了。

4.7使用队列服务进行通信

4.7.1netMsmqBinding

底层的传输机制就是MSMQ,因此可以通过这种绑定来使用MSMQ通信。

4.7.2msmqIntegrationBinding

用来在一个WCF应用程序和一个直接利用MSMQ的应用程序间通信 msmqIntegrationBinding绑定允许MSMQ消息映射到WCF消息。

4.8创建定制化绑定

CustomBinding

4.9绑定元素

4.9.1传输机制

4.9.2编码器 代表了传输信道是如何将一个message类转换成字节流。

4.9.3 安全 <security>

4.9.4传输机制的增强/助力

4.9.5范型转换

4.9.6其他协议

4.10通过多种绑定发布服务契约

5.行为

定义

行为是那些影响运行时操作的WCF类。 行为不仅在客户端和服务器启动WCF运行时(runtime)的时候被执行,还在二者之间流动消息时被执行。

行为主要分为三类

服务行为(Service behaviors)

运行余服务级别,能够访问所有端点。 控制实列画和事务之类的事项,还用于授权(authorization)和审计(auditing)

端点行为(Endpoint behaviors)

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

操作行为(Operation behaviors)

涉及操作级别,适用于序列化/事务流和参数处理。

运行时(runtime)

客户端由ChannelFactory初始化运行时 服务端由ServiceHost初始化运行时

5.1并发与实例化(服务行为)

 InstanceContextMode 用于控制实例化。

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

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

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

ConcurrencyMode 用来控制服务实例内的线程并发。

Single(默认) -- 在同一时刻只有一个线程访问服务类。这是最安全的设置,因为服务操作不需要担心线程安全问题。

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

Multiple -- 多个线程并发访问服务类。此设置需要具有内置的线程安全能力。

单例使用多线程

ServiceBehavior 属性不定义在接口上,而是服务类上,因为ServiceBehavior属性针对的是服务的行为,而不是服务的契约。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class StockService : IStockService {}

控制并发实例的数量

maxConcurrentInstances 最大并发实例数

当InstanceContextMode取值为 PerSession或PerCall 时此配置会起作用,Single表示只存在一个实例;

maxConcurrentCalls 最大并发调用数量

当 ConcurrencyMode 为 Mutiple时起作用;

maxConcurrentSeesions 最大会话数量

当InstanceContextMode取值为PerSession时起作用,当达到最大数量时,会等待其他会话关闭。

5.2导出和发布元数据(服务行为)

要使元数据对客户端可用需要两个步骤 按某种可读的格式导出元数据

默认WSDL

发布到一个可访问的位置

服务通过元数据交换(MEX)端点发布元数据。

5.3实现事务(操作行为)

事务 多步骤业务处理是一个长期运作的处理过程,通常会延续几分钟/几天/几个月。 短期运行的事务是那些通常在几秒内完成的业务操作。 ACID事务

原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可以只执行其中的一部分操作。
一致性(Consistency):操作完成后,所有数据必须符合业务规则(逻辑运算)。
隔离性(Isolation):通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。
(4)持久性(Durability):一旦事务提交,则其所做的修改数据必须以某种方式持久化。

5.3.1服务中的事务化操作

[OperationBehavior(TransactionScopeRequired=true,TransactionAutoComplete=true)]

5.3.2在操作之间的流转事务 事务流(transaction flow)

当在分布式系统中工作时,事务有时必须要跨越服务边界。例如,如果一个服务管理客户信息而另一个服务管理订单,一个客户提交一个订单并想产品可以发送到一个新的地址,系统将需要调用每个服务上的操作。如果事务完成,用户将会期待两个系统上的信息都被合适的更新。
如果基础架构支持一个原子事务协议,服务可以像刚才描述的那样被组合到一个复合事务中。WS-AT(网络服务原子事务)提供在参与的服务间共享信息的平台来实现ACID事务必须的两步语义提交。在WCF中,在服务边界间的流事务信息被称作事务流。

在服务边界间流转事务语义,下面的5步必须实现:

1. (服务契约) SessionMode.Required.  服务契约必须要求会话,因为这是信息如何在合作者和服务组成部分间共享消息的方式。
2. (操作行为) TransactionScopeRequired=true. 操作行为必须要求一个事务范围。如果没有事务存在,那么将会按照要求创建一个新的事务。
3.(操作契约) TransactionFlowOption.Allowed. 操作契约必须允许消息头中包含用于流转的事务信息。
4.(绑定定义) TransactionFlow=true. 绑定必须使能事务流以便于信道可以将事务信息加到SOAP消息头中。也要注意绑定必须支持会话因为wsHttpBinding支持但是basicHttpBinding不支持。
5.(客户端)TransactionScope. 初始化事务的角色(通常是客户端),必须在调用服务操作时使用一个事务作用域。它也必须调用TransactionScope.Close() 来执行改变。

5.3.3选择一个事务协议-OleTx 或者WS-AT 事务管理器

事务管理器负责协调多个部分间的工作并通过资源管理器提交工作。资源管理器负责处理可信赖,持续存储。
WCF将使用三个事务管理器中的一个来完成事务处理。
轻量级事务管理器(LTM)用来在一个应用程序域中管理资源。
核心事务管理器(KTM),仅仅存在于Vista 和Windows Server 2008 系统中,用来管理文件系统和注册表资源的事务。
分布式事务管理器(DTC)用来管理跨程序,进程或者机器边界的事务。

事务协议

OlexTx协议是一种Windows下特定的二进制协议。它源于DTC非常适用于在一个内部网络中通信的情况。
网络服务原子事务协议,或者简称为WS-AT,是一个也支持跨应用,进程和机器的标准协议。但是与OlexTx不同,WS-AT是独立于传输协议的可以再TCP,HTTP或者其他网络协议上流转。

5.3.4事务服务行为

[ServiceBehavior(TransactionIsolationLevel = IsolationLevel.ReadUncommitted, TransactionTimeout="00:01:00")]

5.4实现自定义行为

实现自定义行为需要三步

第一步 创建一个类并实现Inspector, Selector, Formatter或者Invoker接口。

第二步 创建一个类并实现行为接口中的一个: IServiceBehavior, IEndpointBehavior,IOperationBehavior或者IContractBehavior.

第三步 设置客户端和服务端来实现行为。
这可以通过代码实现,配置文件,或者使用下面方法中的一个的属性:

设置ServiceDescription来添加行为。
使用属性向客户端或者服务端运行时添加行为。
使用配置文件向客户端或者服务端运行时添加行为。

5.4.1为服务终结点行为实现一个消息检测器

实现IDispatchMessageInspector接口

BeforeSendRequest
AfterReceiveReply

实现IEndpointBehavior接口

AddDispatchBehavior

5.4.2以属性为服务操作行为暴露一个参数检测器

实现IParemeterInspector接口

_pattern
_message
BeforeCall

实现IEndpointBehavior和Attribute接口

AddDispatchBehavior

5.4.3通过配置文件暴露服务行为

实现IServiceBehavior接口

_EvaluationKey
_EvaluationType.myEndpointBehavior

实现IBehaviorExtensionElement接口

[ConfigurationProperties]
BehaviorType
CreateBehavior

5.5行为安全

ServiceCredentials

Impersionation

ServiceAuthorization

ServiceSecurityAudit

5.6总结

运行时(runtime)

当运行时启动时,它通过检测传递给ClientChannel的类型结构或者ServiceHost来寻找行为,然后在配置文件中寻找。行为也可以在代码中和在打开ServiceHost之前添加到ServiceDescription 对象中定义,或者通过在代码中使用属性,或者在配置文件中。

检验

行为实现检测器-检测提供给它们的对象的代码。在消息层有消息检测器运行,在操作参数上有参数检测器运行。

并发

行为控制服务类和它们的操作的实例和并发。实例由InstanceContextMode设置控制,可以是Single, PerCall或者PerSession.并发由ConcurrencyMode设置控制并可以是Single, Multiple或者Reentrant(单一的,但是是线程安全的代码)。服务行为也允许你限制并发调用,实例或者会话的数量。

serviceMetadata

这个行为在WSDL中暴露WCF类型系统和ServiceDescription模型以便于客户端知道在哪里去找服务,如何使用服务以及要与服务进行什么消息通信。

ACID事务

WCF支持三种事务管理器,一个是一个进程内的本地事务,一个是只用在Vista下的资源,另外一个是分布式事务协调器。额外的,跨越服务边界的通信可以使用一个Windows下才有的扩展RPC的事务协议,或者可以使用基于标准的WS-AT协议。

自定义行为  

自定义行为允许开发人员在服务端,终结点,契约或者操作层创建新的行为。这些行为允许当消息在客户端和服务端之间流转时对其进行检测和修改。它们也允许开发人员或系统管理员当服务启动时验证或者修改WCF运行时。

6.序列化与编码

6.1序列化VS编码

序列化是通常用来描述将一个对象结构转换成一个字节数组过程的规则。 WCF定义序列化作为将一个对象结构转换成一个XML信息集(XML Infoset)的过程. 编码是用来描述将一个WCF消息转换成一个字节数组的规则。 WCF提供了5种编码格式类型:

二进制
文本
消息转换优化架构(MTOM)
JavaScript 对象标记(JSON)
XML(POX)

6.2比较WCF序列化选项

DataContractSerializer WCF中默认的序列化方法是DataContractSerializer.这个类存在于System.Runtime.Serialization命名空间里。 DataContractSerializer是用来支持基于XSD元数据的契约共享的。 自愿加入(opt-in) NetDataContractSerializer NetDataContractSerializer保留了CLR类型和引用信息,因此支持类型不定性(type fidelity)。除了这个,在NetDataContractSerializer和DataContractSerializer之间没有任何不同。 XmlSerializer XmlSerializer 是WCF中可以用来序列化的第三种方法。 使用XmlSerializer有好几个优势,包括对已有.NET类型的支持,与ASP.NET Web 服务的兼容,和控制XML输出结果。 使用XmlSerializer有三种途径

第一个是依赖默认序列化。XmlSerializer 需要一个公共构造函数可以序列化任何公共字段和/或公共可读/可写属性。
第二个方法是使用[XmlElement]和[XmlAttribute]属性来标记公共字段和公共可读/可写属性。
第三种实现是使用IXmlSerializable接口使用XmlSerializer来完成自定义序列化。

申请退出(opt-out) DataContractJsonSerializer 支持使用以JavaScript 对象标记(JSON)作为序列化格式 选择一个序列化器 DataContractSerializer应该作为默认的序列化基础方法因为它是WCF的初始序列化结构。 然而,如果你需要支持已有的类型或者自定义序列化而且它们不被DataContractSerializer支持的话,你可能想要使用XmlSerializer. 最后,DataContractJsonSerializer是服务被AJAX应用调用时最常用的网络场景中最常用的。

6.3保留引用和循环引用

引用保存使得一个数据契约中,对相同的数据可以进行多次引用,而不必复制这些数据。 循环引用是指一个对象维持对子对象的引用,子对象还会对其引用。 维护了循环引用的对象的问题在于,如果没用引用保存,对这种对象序列化是不可能的。

6.4使用NetDataContractSerializer共享类型

WCF 中的默认序列化方法是DataContractSerializer.  这是WCF开发组想要大部分开发人员使用的序列化方法因为它强制进行契约共享而非类型共享。这是创建面向服务架构的一个原则。 然而,如果你的想法是支持类型一致并在客户端和服务端间共享类型信息那么这个方法并不会为你的设计引入问题,你可以使用NetDataContractSerializer来序列化。

6.5使用IExtensibleDataObject 的双向序列化

如果客户端发送给服务端过程中有任何额外信息,在数据发送回给客户端时丢失。这正是IExentsibleDataObject接口要解决的问题。 DataContractSerializer默认行为就是忽略任何未知数据,除非IExentsibleDataObject接口在契约上实现。

6.6使用代理类序列化类型

需要两步来开发一个代理类 第一步是定义代表序列化类型的数据契约。 第二步是实现一个基于IDataContractSurrogate接口的数据契约代理。

GetDataContractType
给DataContractSerializer返回序列化类型
GetDeserializedObject
按要求执行反序列化
GetObjectToSerialize
按要求执行序列化

6.7为大型数据使用流模式

WCF支持两种消息处理模式: 缓冲和流模式。 缓冲是WCF中处理消息的默认模式。在这个模式下,整个消息在发送和接收之前被放入内存中。 在流处理消息的模式中,在客户端和服务端的数据使用一个System.IO.Stream。流模式通常可以在绑定或传输信道上打开。

transferMode
Buffer
Streamed
SteamResponse
StreamRequest

6.8用XmlSerializer定制序列化

 DataContractSerialzier总是使用XML元素进行序列化而不是使用XML属性。

6.8.1用属性定制XML序列化

[XmlAttribute]

[XmlElement]

[XmlRoot]

[XmlArray]

6.8.2用IXmlSerializerd定制XML序列化

IXmlSerializable接口支持三种方法: GetSchema,ReadXml和WriteXml.

6.9编码选择

文本编码与二进制编码 .NET Remoting很适合.NET 应用程序间的通信因为它使用二进制编码传输数据 ASP.NET Web Service选择文本编码,因为这种编码允许跨平台互通。 对我们来说不会直接操作编码。相反,它只能通过发布服务的绑定来指定。

netTcpBinding
binaryMessageEncoding
wsHttpBinding
textMessageEncoding

使用MTOM编码器发送二进制数据 MTOM指的是消息传输优化机制
(Message Transmission Optimization Mechanism)
这是将二进制数据作为SOAP消息的消息体来优化二进制数据发送的标准。 了解WebMessageEncoder WebMessageEncoder编码器支持在XML或者JSON中的请求和回复消息。 WebHttpBehavior默认将请求和回复消息格式设置成WebMessageFormat.Xml. 可以通过[WebGet]属性,把格式设置为WebMessageFormat.Xml或者WebMessageFormat.Json

6.10总结

1.无论何时何地,使用DataContract来序列化是第一选择。这是WCF中默认的序列化机制,强制显式契约来,应该用于面向服务开发。

2. 在很多情况中,比如对现有.NET类型的支持,与ASP.NET 网络服务兼容,控制序列化XML的输出结果等,都需要依赖XmlSerializer。如果需要使用XmlSerializer,请将[XmlSerializerFormat]属性设置在契约的合适位置。如果所有操作都需要使用XML序列化,更要确保这个属性被设置在服务契约上面。

3. 所有WCF自带的绑定都指定了默认编码。如果需要改变绑定的默认编码,最好还是试着使用一个更合适需要的绑定。

4. 创建自定义绑定时,要注意传输层使用的默认编码。如果没有指定编码的话,就会使用传输层的默认编码。

5. 当操作无法在内存中储存大量数据时,就使用WCF内建的流支持功能。如果流模式也不能接受,使用分块技术将数据分割成多条可以发送的消息。

7.托管

7.1在Windows Process Activation Services中托管服务

7.2 在IIS 7中托管服务

7.3在IIS托管的服务中启用ASMX特性

7.4自托管

7.5在managed Windows服务中进行托管

7.6在单进程中托管多个服务

7.7定义服务和端点定制

7.8托管方式的选择

8.安全

8.1WCF安全概念

认证 授权

8.2基于证书的加密

8.3传输级安全

8.3.1用SSL加密

1.在HTTP上使用SSL

2.在TCP上使用SSL

8.3.2客户端认证

1.使用基本证件在basicHttpBinding上做认证

2.使用Windows证件进行认证

3.使用证书在netTcpBinding上进行认证 8.3.3服务身份

8.4消息级安全

1.Windows认证

2.无认证

3.证书认证

8.5用Windows内置安全机制加强服务安全

使用Windows证件认证用户 使用Windows证件为用户授权 用AzMan做授权 角色扮演(impersonation)

8.6加强互联网服务的安全

8.6.1 ASP.NET 集成

8.6.2 用成员资格供应器(Membership Provider)进行认证

8.6.3 用角色供应器(Role Provider)进行基于角色的授权

8.6.4 使用表单认证 HTTP cookie 用作认证令牌

9.诊断

System.Diagnostics

9.1追踪

跟踪用来记录分布式应用程序的多个组件的流转动作和独立动作。

9.2消息日志

用来记录从客户端/服务端或者到客户端/服务端的消息内容。

9.3共享监听器

可以配置一个共享的监听器,赋予它多个源(消息源/踪迹源),输出到单个目标如一个XML文件中。

9.4消息过滤器

通过向<messageLogging>中添加一个<filters>节点来确定过滤器

9.5性能计数器

通过在<system.serviceModel><diagnostics>节点中包含performanceCounters属性来开启性能计数器。

9.6 Windows Mangement Instrumentation

开启WMI与开启性能计数器类似。向<system.serviceModel><diagnostics>节点添加wmiProviderEnabled属性。

9.7服务配置编辑器(Service Configuration Editor)

9.8服务踪迹查看器(Service Trace Viewer)

10.异常处理

10.1暴露异常细节

IncludeExceptionDetailInFaults

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]

10.2通过FaultException管理服务异常

截获异常并抛出FaultException 使用FaultCode 和 FaultReason 来扩展FaultException

10.3简单FaultException的限制

10.4创建和使用强类型的故障

创建FaultContract使用的DataContract

[DataContract]
public class TrackedFault {}

使用FaultContract扩展一个操作定义

[FaultContract(typeof(TrackedFault))]

以FaultContract来抛出FaultException

10.5 应用程序块(application blocks)

Enterprise Library

11.工作流服务

11.1集成点

11.2从WF调用WCF服务

1.使用发送活动 要调用其他交互操作的网络服务,发生活动最合适

2.编写一个定制活动 是一种封装代码的轻量级机制,容易跨工作流复用。

3.使用InvokeWebService 活动 4.使用代码(Code)活动

11.3从WF暴露服务

11.3.1定义接口

11.3.2接收活动

11.3.3 app.config中的配置

11.3.4托管服务工作流

自托管

IIS中托管

11.4相关性与持久服务

要支持长期运行的事务,需要两个要素:相关性(corrclation)和持久性(durability) 相关性让客户端能够指定其希望与之通信的特定工作流实例。 持久性让工作流实例能从系统故障中恢复,并让工作流环境能有效使用内存和CPU资源。

11.5控制对服务工作流的访问

声明式访问控制

编程式访问控制

12.对等网络

12.1构建分布式应用程序的几种方式

客户机/服务器(client/server)架构 n层(n-tier)架构 3层模型

用户界面
业务逻辑
数据

peer-to-peer架构

12.2 peer-to-peer应用程序

1.啮合网络(mesh network)

2. PNRP(Peer Network Resolution Protocol)

3.覆盖式消息递送与定向式消息递送

12.3创建peer-to-peer应用程序

netPeerTcpBinding

12.4使用PNRP解析同侪

IPv6

12.5使用PNRP注册名称

12.6实现定制同侪解析器

12.7限制消息跳跃数

基于覆盖式消息递送的对等网络通常会提供限制消息在网络中传播的距离的方法网络中消息传播的距离常被称作消息的跳跃数(the number of hops)

12.8使用定制绑定的定向式消息递送

寻址方法 (推荐)使用定制绑定元素或可能的消息验查器来处理寻址 应用程序代码中人工处理寻址

13.可编程Web

面向服务的架构方式遵循4个准则

边界是明确的(explicit) 服务是自治的(autonomous) 服务共享的是模式(schema)和契约(contract),而不是类(class); 服务的兼容性取决于策略(policy)

REST遵循下列约束原则

用客户机/服务器方式分离用户界面和数据存储 客户机/服务器的交互是无状态的 使用缓存来提高网络效能 系统组件使用一致的接口进行交互 整个系统能通过分层方式进行组合

13.1 URI详解

URI是用来标识、定位和访问资源的。

13.2 URI和UriTemplates

webHttpBinding

13.3 使用WebGet和WebInvoke

13.4使用WebOperationContext

14.  附录A

A1.元数据发布端点

mexHttpBinding

mexNamedPipeBinding

mexTcpBinding

mexHttpsBinding

A2.根据元数据创建客户端

MetadataResolver

A3.在服务间共享端口

Net.Tcp Port Sharing Service

A4.配置HTTP/TCP连接

1.回收空闲连接

2.调整连接的生命周期

3.关闭HTTP长连接

4.增加连接数

posted @ 2019-08-06 19:57  FH1004322  阅读(470)  评论(0)    收藏  举报