zoukankan      html  css  js  c++  java
  • 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"。

    测试通过。

  • 相关阅读:
    HDU 4772 Zhuge Liang's Password (矩阵旋转)
    POJ 1141 Brackets Sequence(区间DP)
    POJ 2531 Network Saboteur (DFS)
    HDU 2680 Choose the best route (最短路)
    HDU 1285 确定比赛名次 (预处理+拓扑排序)
    HDU 4540 威威猫系列故事——打地鼠 (DP)
    HDU 2899 Strange fuction (二分)
    HDU 3485 Count 101(DP)
    codeforces 510c (拓扑排序)
    codeforces 510B Fox And Two Dots(dfs)
  • 原文地址:https://www.cnblogs.com/sinxsoft/p/1874249.html
Copyright © 2011-2022 走看看