WCF 基础连接已经关闭:连接被意外关闭(大数据量)

时间:2022-01-03 14:53:17
表的字段有64个,查询1000条以内的没有问题,1000以上就报错。配置里需要改的也改了。使用trace_log跟踪提示的是
“进行序列化时出错: ReadVAJ1sResult。InnerException 消息是“对象图中可以序列化或反序列化的项目数目上限为“65535”。请更改对象图或增加 MaxItemsInObjectGraph 的配额”,但是,该配置我已经改过了,还提示这个异常。
另外,我在把服务端的MaxItemsInObjectGraph改成1的时候,程序依然是在1000条以内正常,1000以上报错。我感觉是不是我的服务端的配置没起作用?或者还有其它什么原因引起的这个错误。

附:客户端和服务端配置

服务端:

<system.serviceModel>
      <services>
      <service behaviorConfiguration="ServiceBehavior" name="Service.Service">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBinding"
          contract="IContract.IService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <timeouts closeTimeout="10:10:10" />
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
           <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

      <bindings>
          <basicHttpBinding>
              <binding name="testBinding" closeTimeout="10:50:00" openTimeout="10:10:00"
                  receiveTimeout="10:10:00" sendTimeout="10:10:00" allowCookies="false"
                  bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                  maxBufferSize="2147483647" maxBufferPoolSize="2146483647"
                  maxReceivedMessageSize="2147483647" messageEncoding="Text"
                  textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                  <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
                      maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                  <security mode="None" />
              </binding>
          </basicHttpBinding>
      </bindings>
  </system.serviceModel>


客户端:

<system.serviceModel>
         <behaviors>
            <endpointBehaviors>
                <behavior name="metadataBehavior">
                    <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService" closeTimeout="10:55:00"
                    openTimeout="10:55:00" receiveTimeout="10:50:00" sendTimeout="10:55:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="2147483647" maxBufferPoolSize="2146483647"
                    maxReceivedMessageSize="2147483647" messageEncoding="Text"
                    textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="64" 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://dd0402ijd/WCFSVN/Service.svc" behaviorConfiguration="metadataBehavior"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
                contract="wcfSVC.IService" name="BasicHttpBinding_IService" />
         </client>
    </system.serviceModel>

10 个解决方案

#2


楼上是不是不看问题的具体内容就直接发了个地址? 你发的这个地址里的东西,我都配置过了。

#3


确认一下,客户端连的服务端配置已经修改了?还是只是修改了本机,而发布的服务并未修改。


#4


引用 3 楼  的回复:
确认一下,客户端连的服务端配置已经修改了?还是只是修改了本机,而发布的服务并未修改。

都修改了。客户端的MaxItemsInObjectGraph是有效的,因为我将其值改成1,是对数据结果产生影响了。但是服务端,我将这个属性的值改成1,却对结果没有任何影响

#5


那真是奇怪了。一般修改上面的配置就能解决了。
会不会是IIS的HttRequest大小限制。

<httpRuntime maxRequestLength="20000" executionTimeout="600" />

另外,你先本地创建一个WCF 工程测试一下,是否发生同样的问题。

#6


HttRequest也配置过,没用。我现在用的就是在本地。调试了很久都没找到问题所在。

#7


该回复于2012-04-18 10:20:28被版主删除

#8


引用 6 楼  的回复:
HttRequest也配置过,没用。我现在用的就是在本地。调试了很久都没找到问题所在。


你把测试工程上传下,我下来跑跑看。

#9


感谢fangxinggood的帮忙。 
我已经找到问题的所在了,是实体序列化造成的。数据层使用了一个ORM框架,实体的序列化实际上没有完成(即使使用了DataContract和DataMemeber),所以在服务端配置的MaxItemsInObjectGraph总是没起到作用。

#10


hi,楼主,我也碰到同样的问题,那么样保证序列化实际完成了呢?(除了使用DataContract和DataMemeber)

#1


#2


楼上是不是不看问题的具体内容就直接发了个地址? 你发的这个地址里的东西,我都配置过了。

#3


确认一下,客户端连的服务端配置已经修改了?还是只是修改了本机,而发布的服务并未修改。


#4


引用 3 楼  的回复:
确认一下,客户端连的服务端配置已经修改了?还是只是修改了本机,而发布的服务并未修改。

都修改了。客户端的MaxItemsInObjectGraph是有效的,因为我将其值改成1,是对数据结果产生影响了。但是服务端,我将这个属性的值改成1,却对结果没有任何影响

#5


那真是奇怪了。一般修改上面的配置就能解决了。
会不会是IIS的HttRequest大小限制。

<httpRuntime maxRequestLength="20000" executionTimeout="600" />

另外,你先本地创建一个WCF 工程测试一下,是否发生同样的问题。

#6


HttRequest也配置过,没用。我现在用的就是在本地。调试了很久都没找到问题所在。

#7


该回复于2012-04-18 10:20:28被版主删除

#8


引用 6 楼  的回复:
HttRequest也配置过,没用。我现在用的就是在本地。调试了很久都没找到问题所在。


你把测试工程上传下,我下来跑跑看。

#9


感谢fangxinggood的帮忙。 
我已经找到问题的所在了,是实体序列化造成的。数据层使用了一个ORM框架,实体的序列化实际上没有完成(即使使用了DataContract和DataMemeber),所以在服务端配置的MaxItemsInObjectGraph总是没起到作用。

#10


hi,楼主,我也碰到同样的问题,那么样保证序列化实际完成了呢?(除了使用DataContract和DataMemeber)