System.ServiceModel.CommunicationException:基础连接已关闭

时间:2013-10-22 13:15:55

标签: c# asp.net .net wcf sockets

我正在从wcf网络服务中检索数据,当数据超过20万条记录时,我得到一个异常,如下所示:

System.ServiceModel.CommunicationException: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. ---> System.Net.WebException: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
--- End of inner exception stack trace ---

Server stack trace: 
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

我的web.config看起来像这样:

<basicHttpBinding>
  <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
             maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
             allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
             messageEncoding="Text" textEncoding="utf-8" transferMode="StreamedResponse" useDefaultWebProxy="true">
    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
                  maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    <security mode="None">
      <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
  </binding>
  <binding maxReceivedMessageSize="2147483647" allowCookies="true">
    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
  </binding>
</basicHttpBinding>

我确信我的网络服务正在从数据库中检索数据。但无法从我发起呼叫的地方转移到我的网站。提前感谢您的帮助。

5 个答案:

答案 0 :(得分:15)

我最近在.Net 4.0网络应用程序中遇到了与Wcf服务相同的问题。我增加了maxItemsInObjectGraph值,服务器不再抛出异常。文档here表示默认最大值为Int32.MaxValue,但我认为它不正确,最大值为65535。

   <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <dataContractSerializer maxItemsInObjectGraph="6553500"/>
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>

您可以做的另一件事是启用跟踪。这是我在web.config中的一个例子:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel"
            switchValue="Information, ActivityTracing"
            propagateActivity="true">
      <listeners>
        <add name="traceListener"
            type="System.Diagnostics.XmlWriterTraceListener"
            initializeData= "c:\temp\log\Traces.svclog" />
      </listeners>
    </source>
  </sources>
</system.diagnostics>

如果双击Traces.svclog,Windows应该打开Microsoft服务跟踪查看器。

如果使用Microsoft WCF测试客户端测试服务,请确保更改默认客户端配置以匹配服务器设置(这包括客户端端点行为),以确保客户端可以从服务器接收响应。

我希望这会有所帮助。

答案 1 :(得分:2)

使您的客户端basicHttpBinding与您的服务器绑定相同。这是一个非常常见的错误,只能更改一个绑定而不是服务器和客户端绑定。

如果不起作用,您可以启用wcf跟踪: wcf tracing

这将为您提供有关底层问题的更多见解。

答案 2 :(得分:0)

我们的对象图中有一个循环返回。我知道这可能不是你的问题但是我在这里添加它以防其他人有同样的问题。我们启用了includeExceptionDetailInFaults,但没有在任何客户端(我们的应用程序或WCF测试客户端)中收到错误。幸运的是它出现在服务器日志中,所以我们能够找到它。

我们有父母 - &gt;儿童和孩子 - &gt;双向导航的父级,我们必须打破该链接,而是拥有父级 - &gt;孩子,孩子有一个id来查找父母,然后错误就消失了。

希望这有助于某人!

答案 3 :(得分:0)

将以下配置添加到您的wcf服务配置中。并查看c:\ log \ Traces.svclog文件。 我的例外是扔掉;

尝试序列化参数时出错 InnerException消息'Enum value'0'对于'ThyCams2014.XrmBase.new_filingstatu'类型无效,无法序列化。确保存在必要的枚举值,并且如果类型具有DataContractAttribute attrienter code herebute,则使用EnumMemberAttribute属性标记。有关详细信息,请参阅InnerException。

<configuration>
   <system.diagnostics>
      <sources>
            <source name="System.ServiceModel" 
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="traceListener" 
                   type="System.Diagnostics.XmlWriterTraceListener" 
                   initializeData= "c:\log\Traces.svclog" />
            </listeners>
         </source>
      </sources>
   </system.diagnostics>
</configuration>

答案 4 :(得分:0)

这句话解决了我的问题:

db.ContextConfiguration.ProxyCreationEnabled = false;