WCF可信赖会话正确使用方法介绍

开发 开发工具
WCF可信赖会话主要可以帮助我们在安全方面提供一个更加安全的操作。在这篇文章中,我们将会为大家详细介绍一些这方面的应用技巧。

WCF开发插件是一个功能非常强大的工具,可以帮助我们轻松的实现一些安全性较强的开发解决方案。在这里我们将会针对WCF可信赖会话的相关特点为大家详细介绍一些WCF安全方面的知识。#t#

如果需要保证消息的传输正确性,以及传输的消息顺序,在WCF中的实现非常容易,即使用可信赖会话ReliableSession,前提是我们应该选择正确的绑定。支持可信赖会话的绑定包括WSHttpBinding,WSDualHttpBinding,WSFederationBinding以及NetTcpBinding和NetNamedPipesBinding(该绑定使用IPC协议,按照Juval Lowy的说法,该绑定的类名并不合理。绑定的类名通常根据协议命名,而不是根据它所采用的技术,例如NetTcpBinding而不是NetSocketBinding。因此IPC绑定应命名为NetIPCBinding,而不是NetNamedPipesBinding)。其中,与WS-*相关的绑定需要手动打开WCF可信赖会话。

由于绑定可以采用配置方式设定,因此,是否增加可信赖传输与具体的服务契约代码无关。此外,绑定的选择同样可以通过配置文件修改,这就保证了WCF实现的灵活性。配置可信赖会话的方式如下所示:

  1. < wsHttpBinding> 
  2. < binding name="reliableBinding" receiveTimeout="00:20:00"> 
  3. < reliableSession enabled="true" ordered="true" 
    inactivityTimeout="00:20:00"/> 
  4. < /binding> 
  5. < /wsHttpBinding> 

在配置文件中,让人疑惑不解的是两个超时值的设置。两者代表了不同的含义。receiveTimeout与应用程序消息相关,而inactivityTimeout则与应用程序以及基础架构消息相关。举例来说,如果一个服务契约包含了三个服务操作,且这三个操作将形成一个有序的序列(传输的消息顺序与此相关),那么计算非活动状态的值,对于前者而言是从调用服务对象的某一个操作之后开始计算,而后者则针对整个序列的操作。根据MSDN的解释,基础架构消息是指为了通道堆栈中的协议之一(例如,保持活动状态或确认,而并非包含应用程序数据)而生成的消息。

在WCF可信赖会话中,任何一个超时值计时器触发都会断开连接,因此单独改变其中某一个的值是没有意义的。如果值不相同,则取两个值之间的最小值。他们的默认值均为10秒。

ReliableSession的Ordered属性保证了消息的传输顺序。它不意味着我们在调用服务对象时,必须遵循操作调用的顺序,而是指消息在发送时,必须按照调用的顺序传送。例如一个服务契约定义了M1,M2,M3三个服务操作。如果服务对象的调用顺序如下所示:

  1. m_proxy.M1();  
  2. m_proxy.M2();  
  3. m_proxy.M3(); 

则消息的顺序为M1-> M2 -> M3。如果修改操作的调用顺序如下:

  1. m_proxy.M3();  
  2. m_proxy.M2();  
  3. m_proxy.M1(); 

则消息的顺序为M3-> M2 -> M1。因此,我们应注意它与所谓的“分步操作(Demarcating Operation)”的区别。分步操作通过在[OperationContract]中指定IsInitiating和IsTerminating的值,标示操作的调用顺序。在DevX的一篇文章中有如下的服务契约定义:

 

  1. [ServiceContract]  
  2. public interface IChopstickBuilder  
  3. {  
  4. [OperationContract]  
  5. int GetChopsticksUnderConstruction();  
  6. [OperationContract]  
  7. void WarmupChopstickMachine();  
  8. [OperationContract]  
  9. void ConstructAChopstick();  

其中要求WarmupChopstickMachine()必须在ConstructAChopstick()操作之前调用。为保证客户端调用不出现顺序的错误,单单启动WCF可信赖会话的有序传递仍嫌不足。此时,我们可以为WarmupChopstickMachine()操作定义分步操作:

  1. [OperationContract(IsInitiating = true)]  
  2. void WarmupChopstickMachine(); 

不过,这样的操作定义实际上是无效的,因为IsInitiating的默认值本身就是true,这样的设置与不设置的效果完全一致。因此,我们可以考虑对ConstructAChopstick()和GetChopsticksUnderConstruction()进行设置:

 

  1. [ServiceContract(SessionModeSessionMode = SessionMode.Required)]  
  2. public interface IChopstickBuilder  
  3. {  
  4. [OperationContract(IsInitiating = falseIsTerminating = true)]  
  5. int GetChopsticksUnderConstruction();  
  6. [OperationContract]  
  7. void WarmupChopstickMachine();  
  8. [OperationContract(IsInitiating = false)]  
  9. void ConstructAChopstick();  

使用分步操作需要会话的支持,因此需要在服务契约上将SessionMode设置为Required,否则会抛出InvalidOperationException异常。

对于某些严格要求WCF可信赖会话的服务,为避免配置文件中错误设置可信赖会话的可能,可以强制要求WCF检查包含该服务契约的终结点,确认它是否选择了支持可信赖会话的绑定,并支持有序传递:

 

  1. [ServiceContract(SessionModeSessionMode = SessionMode.Required)]  
  2. [DeliveryRequirements(RequireOrderedDelivery = true)]  
  3. public interface MyReliableService... 

以上就是我们为大家详细介绍的WCF可信赖会话的具体内容。

责任编辑:曹凯 来源: agiledon.com
相关推荐

2011-07-12 23:37:01

ITSS

2010-03-02 16:58:11

AJAX WCF服务项

2010-03-02 14:12:30

WCF枚举类型

2015-04-27 18:53:21

H3Cloud/华三

2010-03-01 17:39:07

WCF Address

2009-12-21 17:40:25

WCF会话

2014-12-08 14:25:30

2018-08-03 17:03:00

商用软件

2010-01-20 17:47:54

VB.NET注释

2010-02-23 17:05:38

2010-02-25 16:07:28

WCF REST

2015-04-29 18:34:19

阿里移动事业群UC高德地图

2009-03-19 16:23:48

2010-02-25 16:52:12

引用WCF服务

2009-11-09 10:59:57

WCF回调

2011-04-27 16:38:31

投影机

2010-03-04 15:17:30

Python prin
点赞
收藏

51CTO技术栈公众号