解决WCF Stream对象绑架限制

开发 后端
这里就WCF Stream对象的MaxReceivedMessageSize的限制、操作参数的限制、实例激活类型的限制三方面做出全面的分析,大家仔细阅读,一定会有很大的收获。

WCF有很多值得学习的地方,这里我们主要介绍WCF在支持Stream对象的一些技巧,首先我们就来看看对MaxReceivedMessageSize的限制MaxReceivedMessageSize属性的默认值为64kb,如果传递的WCF Stream对象一旦超过了MaxReceivedMessageSize属性的设置值,则客户端在操作该对象时,就会出现CommunicationException异常。因此,我们应根据实际需要设置MaxReceivedMessageSize的值。MaxReceivedMessageSize属性的取值范围为1-9223372036854775807(Int32.MaxValue)。如果设置值不在该范围之内,则无法通过编译。

编程方式设置为:

  1. binding.MaxReceivedMessageSize=120000


配置文件的设置方式为:

  1. <binding……maxReceivedMessageSize="120000"/> 

1.操作参数的限制

WCF对包含了Stream对象的操作参数进行严格的限制,它只允许这样的操作只能包含一个Stream对象,这里所谓的一个Stream对象,是包含return对象,out和ref对象在内的。也就是说如下的操作定义都是错误的:

  1. voidTransfer(Streams1,Streams2);  
  2. voidTransfer(Streams1,outStreams2);  
  3. voidTransfer(Streams1,refStreams2);  
  4. StreamTransfer(Streamstream); 

如果定义了这样的操作,则会出现运行时错误。

2.实例激活类型的限制

由于Stream操作受到绑定的限制,只能使用BasicHttpBinding,NetTcpBinding以及NetNamedPipeBinding绑定,因此必然会影响服务实例的激活类型,最主要的是对Session模式的影响。首先BasicHttpBinding并不支持Session模式的激活类型。NetTcpBinding以及NetNamedPipeBinding绑定虽然支持Session模式,但是由于Stream操作不支持可靠消息传递,即不能将ReliableSession设置为true。因此在定义服务契约的SessionMode时,不能将其值设置为SessionMode.Required,否则会抛出异常。

#T#实际上,WCF Stream操作(指TransferMode不为Buffered)本身并不支持Session模式。即使我们在使用NetTcpBinding时,将服务契约的SessionMode设置为Allowed,并将服务的InstanceContextMode设置为PerSession,服务的执行方式仍然是PerCall方式。(如果不是Stream操作,这样的设置服务应为PerSession模式)因此,在执行Stream操作时,即使按照Session模式对服务进行设置,如果我们通过OperationContext.Current.SessionId去获得会话ID,其值应该为空。

此外,由于传输的WCF Stream对象较大,可能会消耗过长的时间,因而建议增大绑定的SendTimeout属性值。例如设置为10分钟。编程方式设置为:

  1. binding.SendTimeout=TimeSpan.FromMinutes(10); 

配置文件的设置方式为:

  1. <binding……sendTimeout="00:10:00"/> 

注意,对绑定的相关设置必须要求服务端与客户端的配置一致。最佳实践是均通过配置文件进行设置。例如在我的应用程序中是这样设置的:

  1. <basicHttpBinding> 
  2. <bindingnamebindingname="DocumentExplorerServiceBinding" 
  3. sendTimeout="00:10:00" 
  4. transferMode="Streamed" 
  5. messageEncoding="Text" 
  6. textEncoding="utf-8" 
  7. maxReceivedMessageSize="9223372036854775807"> 
  8. </binding> 
  9. </basicHttpBinding> 
责任编辑:田树 来源: 博客
相关推荐

2009-11-06 16:35:56

WCF Stream对

2010-03-01 17:28:25

WCF Stream对

2009-11-09 13:47:22

WCF Stream操

2009-11-05 14:47:35

WCF Stream对

2009-11-09 13:56:15

WCF Stream对

2009-12-21 15:12:40

WCF操作Stream

2010-02-22 10:42:12

WCF Stream

2010-02-26 10:56:06

WCF Stream

2009-11-06 13:33:56

WCF Dispatc

2010-02-24 17:47:05

WCF集合类型

2009-12-08 16:42:48

WCF Service

2009-12-08 16:30:29

WCF程序

2009-06-12 14:32:53

WCFJSON对象jQuery

2010-02-23 14:56:18

WCF Bug

2009-12-07 18:38:16

WCF异常

2009-12-07 18:47:16

WCF流

2009-12-07 16:23:46

WCF编程

2009-11-09 10:10:13

WCF异常

2009-11-09 09:06:44

WCF端口

2010-02-26 15:24:27

WCF释放服务对象
点赞
收藏

51CTO技术栈公众号