webentwicklung-frage-antwort-db.com.de

System.ServiceModel.CommunicationException: Die zugrunde liegende Verbindung wurde geschlossen

Ich rufe Daten von einem wcf-Webdienst ab. Wenn mehr als 0,2 Millionen Datensätze vorliegen, erhalte ich eine Ausnahme, die wie folgt aussieht: 

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)

Meine web.config sieht so aus:

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

Ich bin sicher, dass mein Webservice Daten von der DB abruft. kann jedoch nicht von meinem Standort aus auf mein Web übertragen werden. Vielen Dank im Voraus für jede Hilfe.

15
user2907164

Ich hatte kürzlich das gleiche Problem mit einem Wcf-Dienst in einer .NET 4.0-Web-App. Ich habe den Wert für maxItemsInObjectGraph erhöht und der Server hat die Ausnahme nicht mehr ausgelöst. Die Dokumentation hier sagt, das Standardmaximum ist Int32.MaxValue, aber ich denke es ist falsch, der Maximalwert ist 65535.

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

Die andere Möglichkeit, die Sie tun können, ist die Verfolgung zu aktivieren. Dies ist ein Beispiel von dem, was ich in der web.config habe:

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

Wenn Sie auf Traces.svclog doppelklicken, sollte Windows den Microsoft Service Trace Viewer öffnen.

Wenn Sie Ihren Dienst mit dem Microsoft WCF-Testclient testen, stellen Sie sicher, dass Sie die Standardclientkonfiguration so ändern, dass sie den Servereinstellungen entspricht (dazu gehört auch das Verhalten des Clientendpunkts), um sicherzustellen, dass der Client die Antwort vom Server erhalten kann.

Ich hoffe das hilft.

15
costa

Machen Sie Ihren Client als basicHttpBinding so wie Ihre Serverbindung. Dies ist ein sehr häufiger Fehler, nur eine Bindung anstelle von Server- und Client-Bindung zu ändern.

Wenn dies nicht funktioniert, können Sie die wcf-Ablaufverfolgung aktivieren: wcf-Ablaufverfolgung

Dadurch erhalten Sie mehr Einblick in das zugrunde liegende Problem.

2
Peter

wir hatten eine Schleife in unserer Objektgrafik, die zurückkehrte. Ich weiß, dass dies wahrscheinlich nicht Ihr Problem ist, aber ich füge es hier hinzu, falls jemand anderes das gleiche Problem hat. Wir hatten includeExceptionDetailInFaults aktiviert, bekamen jedoch keinen Fehler in einem Client (unserer Anwendung oder dem WCF-Testclient). Glücklicherweise wurde dies in Serverprotokollen angezeigt, sodass wir es so finden konnten.

Wir hatten Eltern -> Kind und Kind -> Eltern für die bidirektionale Navigation, wir mussten diesen Link unterbrechen und stattdessen Eltern -> Kind haben, und das Kind hatte eine ID, um den Eltern zu suchen, dann ging der Fehler weg.

Hoffe das hilft jemandem!

0
matao

Diese Aussage hat mein Problem gelöst:

db.ContextConfiguration.ProxyCreationEnabled = false;
0
Dumindu

Fügen Sie der wcf-Dienstkonfiguration die folgende Konfiguration hinzu. Und siehe die Datei c:\log\Traces.svclog. Meine Ausnahme war ein Wurf für;

Beim Versuch, den Parameter .__ zu serialisieren, ist ein Fehler aufgetreten. Die InnerException-Nachricht war 'Der Enumerationswert' 0 'ist für den Typ' ThyCams2014.XrmBase.new_filingstatu 'ungültig und kann nicht serialisiert werden. Stellen Sie sicher, dass die erforderlichen Aufzählungswerte vorhanden sind und mit dem EnumMemberAttribute-Attribut gekennzeichnet sind, wenn der Typ den DataContractAttribute-Attrienter-Code hier enthält. Weitere Informationen finden Sie in 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>
0
Serkanb