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"。

测试通过。

原文地址:https://www.cnblogs.com/sinxsoft/p/1874249.html