WCF能够维持客户端与特定的服务实例之间的会话,服务被配置为会话(Persession)服务,当客户端为该服务创建一个新的代理时,就会获得一个新建的专有的服务实例,它与相同服务的所有其它实例无关。该实例将一直保留在服务中直到客户端不再需要它。这非常类似与经典的C/S模型。它与C/S模式一样,仍然存在可伸缩性以及事务处理的问题。一个配置了私有会话的服务通常无法支持多达几十个独立的客户端,因为创建专门的服务实例的代价太大。
配置私有会话
配置会话需要三个元素:行为、绑定、契约。
行为:需要将服务行为ServiceBehavior的实例模式设置为PerSesion。
绑定:为了关联所有从特定的客户端发送到特定实例的消息,WCF需要有识别客户端的能力。一种是依靠传输层会话,即传输层的持久连接,如,在使用NetTcpBinding或者NetNamedPipeBinding时,WCF会关联客户端的连接。对于WS绑定,它能够模拟传输层会话,包括消息头的逻辑会话ID,通过该ID能够唯一的识别客户端。事实上,只要启用了安全或可靠的消息传输,WSHttpBinding就会模拟一个传输会话。
契约:当需要跨越服务边界时,则需要契约,因为客户端的WCF运行时需要知道服务是否使用了会话。使用ServiceContract的SessionMode属性可以设置会话契约。它可以设置为:Allowed,Required,NotAllowed三种。
会话与可靠性
客户端与服务实例之间唯一可靠的会话就是基本的传输会话。因此,一个实现了会话契约的服务,它包含的所有终结点所公开的契约都应该使用支持可靠传输会话的绑定。
会话ID
每个会话都拥有一个客户端和服务端都能获得的唯一ID。会话ID是GUID的形式,用于日志记录与分析。服务可以通过操作调用上下文(Operation Call Context)访问会话ID。每个服务操作都拥有一个操作调用上下文,它是一个属性集,可以用于除了回调、事务、管理、安全、宿主访问以及访问定义在执行上下文中的对象之外的多种情形。OperationContext类提供了对操作上下文以及会话ID的访问,服务可以通过该类的Current静态方法获取当前方法操作上下文的一个引用。
会话终止
每个会话有一个空闲超时值,默认为10min。会话如果因为空闲超时的原因被终止,当再次调用时会获得一个CommunicationObjectFaultedException异常。支持可靠传输层会话的绑定提供了ReliableSession属性类,该类定义了InactivityTimeout属性可以定制不同的超时值。