System.ServiceModel.CommunicationException:The underlying connection was closed: The connection was closed unexpectedly

在开发WCF的过程中,发现了当请求数据量超过了一定大小的时候,就报异常:

System.ServiceModel.CommunicationException:The underlying connection was closed: The connection was closed unexpectedly

先看服务器:

 

<? xml version="1.0" encoding="utf-8" ?>
< configuration >
  
< configSections >
    
< section  name ="cachingConfiguration"  type ="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  requirePermission ="true"   />
  
</ configSections >
  
< cachingConfiguration  defaultCacheManager ="Session" >
    
< cacheManagers >
      
< add  name ="Session"  type ="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  expirationPollFrequencyInSeconds ="60"  maximumElementsInCacheBeforeScavenging ="10000"  numberToRemoveWhenScavenging ="10"  backingStoreName ="NullBackingStore"   />
    
</ cacheManagers >
    
< backingStores >
      
< add  type ="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  name ="NullBackingStore"   />
    
</ backingStores >
  
</ cachingConfiguration >
  
< system.web >
    
< compilation  debug ="true"  targetFramework ="4.0" >
      
< assemblies >
        
< add  assembly ="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"   />
      
</ assemblies >
    
</ compilation >
  
</ system.web >
  
< system.serviceModel >
    
<!-- 该值指示此服务是否在 ASP.NET HTTP 应用程序管道的上下文中运行 -->
    
< serviceHostingEnvironment  aspNetCompatibilityEnabled ="true"  multipleSiteBindingsEnabled ="true"   />
    
< services >
      
< service  name ="WmsService.Service"  behaviorConfiguration ="XRServiceBehavior" >
        
< endpoint  bindingConfiguration ="BasicHttpBinding"  binding ="basicHttpBinding"  contract ="WmsService.IService"   />
      
</ service >
    
</ services >
    
< behaviors >
      
< serviceBehaviors >
        
< behavior  name ="XRServiceBehavior" >
          
< serviceMetadata  httpGetEnabled ="true"   />
          
< serviceDebug  httpHelpPageEnabled ="false"  includeExceptionDetailInFaults ="true"   />
        
</ behavior >
       </ serviceBehaviors >
    
</ behaviors >
    
< bindings >
      
< basicHttpBinding >
        
< binding  name ="BasicHttpBinding"  allowCookies ="true"  maxReceivedMessageSize ="2147483647"  maxBufferPoolSize ="2147483647"  maxBufferSize ="2147483647" >
          
< readerQuotas  maxDepth ="2147483647"  maxStringContentLength ="2147483647"  maxArrayLength ="2147483647"  maxBytesPerRead ="2147483647"  maxNameTableCharCount ="2147483647"   />
          
< security  mode ="None" >
            
< transport  clientCredentialType ="None"  proxyCredentialType ="None"  realm =""   />
            
< message  clientCredentialType ="UserName"  algorithmSuite ="Default"   />
          
</ security >
        
</ binding >
      
</ basicHttpBinding >
    
</ bindings >
  
</ system.serviceModel >
  
< system.webServer >
    
< modules  runAllManagedModulesForAllRequests ="true"   />
  
</ system.webServer >
 
</ configuration >

 

 

再看客户端:

 

<? xml version="1.0" encoding="utf-8" ?>
< configuration >
  
< system.serviceModel >
    
< bindings >
      
< basicHttpBinding >
        
< binding  name ="BasicHttpBinding_IService"  allowCookies ="true"  maxReceivedMessageSize ="2147483647"  maxBufferPoolSize ="2147483647"  maxBufferSize ="2147483647" >
          
< readerQuotas  maxDepth ="2147483647"  maxStringContentLength ="2147483647"  maxArrayLength ="2147483647"  maxBytesPerRead ="2147483647"  maxNameTableCharCount ="2147483647"   />
          
< security  mode ="None" >
            
< transport  clientCredentialType ="None"  proxyCredentialType ="None"  realm =""   />
            
< message  clientCredentialType ="UserName"  algorithmSuite ="Default"   />
          
</ security >
        
</ binding >
      
</ basicHttpBinding >
    
</ bindings >
    
< client >
      
< endpoint  address ="http://localhost:3609/Service.svc"  binding ="basicHttpBinding"  bindingConfiguration ="BasicHttpBinding_IService"  contract ="WmsService.IService"  name ="BasicHttpBinding_IService"   />
    
</ client >
    
</ system.serviceModel >   
</ configuration >

 

 

 

通过寻找,终于找到原因:原来是behavior在作怪:在行为节点下面有一个类dataContractSerializer,此类有一个属性MaxItemsInObjectGraph,用来控制序列化对象中允许的最大项数。默认值为 65536 字节 (64KB),一旦数据超出了该值,则抛出通信异常。解决方法:

在服务器的的行为配置下加上<dataContractSerializer maxItemsInObjectGraph="2147483647"/>

在客户端加上节点:

 

  < behaviors >
      
< endpointBehaviors >
        
< behavior  name ="superBehavior" >
          
< dataContractSerializer
            
maxItemsInObjectGraph ="2147483647"   />
        
</ behavior >
      
</ endpointBehaviors >
 
</ behaviors >

 

然后在endpoint节点上设置属性:behaviorConfiguration="superBehavior"。

测试通过。

你可能感兴趣的:(Connection)