[MSDN]WCF(9)会话、实例化和并发

说明:本内容来自微软的webcast,讲师为徐长龙。为了用手机阅读方便点,抄录存为txt。

本次课程内容包括
- 会话
- 实例化
- 并发

会话
- “会话”是在两个终结点之间发送的所有消息的一种相互关系
- 在服务协定上设置
  System.ServiceModel.ServiceContractAttribute.SessionMode 值
  - Allowed: 默认
    - 客户端可以进行连接,并选择建立会话或不建立会话
  - Required
    - 所有调用(即,支持调用的基础消息交换)都必须是同一个对话的一部分。
  - NotAllowed
    - 禁止会话
- WCF 会话具有下列主要概念性功能:
  - 它们有调用应用程序显示启动和终止。
  - 会话期间传递的消息按照接收消息的顺序进行处理。
  - 会话将一组消息相互关联,从而形成对话。该关联的含义是抽象的。例如,一个基于会话的通道可能会根据共享网络连接来关联消息,而另一个基于会话的通道可能会根据消息正文中的共享标记来关联消息。可以从会话派生的功能取决于关联的性质。
  - 不存在于 WCF 会话相关联的常规数据存储区。
- ASP.NET 会话和 WCF 会话的区别
  - ASP.NET 会话总是有服务器启动
  - ASP.NET 会话原本是无序的
  - ASP.NET 会话提供了一种跨请求的常规数据存储机制。
- 客户端应用程序和服务应用程序以不同方式与会话交互。
  - 客户端应用程序启动会话,然后接受并处理在该会话内发送的消息。
  - 服务应用程序可以将会话用作扩展点,以添加其他行为。通过直接使用 InstanceContext 或实现一个自定义实例上下文提供程序,可以做到这一点。
- 当 WCF 服务接受客户端会话时,默认情况下启用以下功能:
  - 通过同一个用户定义的服务对象来处理WCF客户端对象之间的所有调用
  - 除了此实例化行为之外,不同的基于会话的绑定还会提供其他功能。
- 系统提供的会话类型
  - System.ServiceModel.Channels.SecurityBindingElement 支持基于安全的会话,其中,两个通信端采用统一的安全对话。
  - System.ServiceModel.WSHttpBinding 绑定(包含对安全会话和可靠会话的支持)默认情况下只使用对消息进行加密和数字签名的安全会话。
  - System.ServiceModel.NetTcpBinding 绑定支持基于TCP/IP的会话,以确保所有消息都由套接字级别的连接进行关联。
  - System.ServiceModel.Channels.ReliableSessionBindingElement 元素实现 WS-ReliableMessaging 规范,并提供对可靠会话的支持。在可靠会话中,可以配置消息以按顺序传递并且只传递一次,从而使消息在对话期间即使经过多个节点也可以确保保密性。
  - System.ServiceModel.NetMsmqBinding 绑定提供 MSMQ 数据报会话。


实例化
- 实例化行为(使用System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode属性进行设置)控制如何创建 InstanceContext 以响应传入的消息。
- 默认情况下,每个 InstanceContext 都与一个用户定义服务对象相关联,因此(在默认情况下)设置 InstanceContextMode 属性也可以控制用户定义服务对象的实例化。
- 可以使用下列实例化模式:
  - PerCall:
    - 为每个客户端请求创建一个新的 InstanceContext (以及相应的服务对象)。
  - PerSession:
    - 为每个新的客户端会话创建一个新的 InstanceContext (以及相应的服务对象),并在该会话的生存期内对其进行维护(这需要使用支持会话的绑定)。
  - Single:
    - 单个 InstanceContext (以及相应的服务对象)处理应用程序生存期内的所有客户端请求。


并发
- 并发是对 InstanceContext 中在任一时刻处于活动状态的线程数量的控制。
- 此控制是通过将 System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode 与 concurrency 枚举结合使用来实现的。
- 有以下三种可用的并发模式:
  - Single: 最多允许每个实例上下文同时拥有一个对该实例上下文中的消息进行处理的线程。其他希望使用同一个实例上下文的线程必须一直阻塞,直到原始线程退出该实例上下文为止。
  - Multiple: 每个服务实例都可以拥有多个同时处理消息的线程。若要使用此并发模式,服务实现必须是线程安全的。
  - Reentrant: 每个服务实例一次只能处理一个消息,但可以接受可重入的操作调用。仅当服务通过WCF客户端对象提供服务时才会接受这些调用。
- 并发的使用与实例化模式有关。在 PerCall 实例化过程中,与并发没有关系,因为每个消息都有一个新 InstanceContext 处理,因此 InstanceContext 中处于活动状态的线程永远都不会超过一个。


会话与 InstanceContext 设置进行交互
- SessionMode 属性值和 InstanceContextMode 属性值组合的情况下支持会话或不支持会话的传入通道的结果。
  表格略

原文地址:https://www.cnblogs.com/htht66/p/2328856.html