web-dev-qa-db-fra.com

System.ServiceModel.CommunicationException: la connexion sous-jacente a été fermée

Je récupère des données à partir d'un service Web wcf et lorsque les données dépassent 0,2 million d'enregistrements, j'obtiens une exception qui correspond à: 

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)

Mon web.config ressemble à ceci:

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

Je suis sûr que mon service Web récupère des données de la base de données. mais est incapable de transférer sur mon site Web à partir duquel j'ai initié l'appel. Merci d'avance pour votre aide.

15
user2907164

J'ai récemment eu le même problème avec un service Wcf dans une application Web .Net 4.0. J'ai augmenté la valeur maxItemsInObjectGraph et le serveur n'a plus levé l'exception. La documentation ici indique que le maximum par défaut est Int32.MaxValue mais je pense que c'est incorrect, la valeur maximale est 65535.

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

L'autre chose que vous pouvez faire est d'activer le traçage. Voici un exemple de ce que j'ai dans le fichier 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>

Si vous double-cliquez sur le fichier Traces.sv, les fenêtres doivent ouvrir Microsoft Service Trace Viewer.

Si vous testez votre service avec le client de test Microsoft WCF, veillez à modifier la configuration du client par défaut afin qu'elle corresponde aux paramètres du serveur (y compris le comportement du point de terminaison du client) pour vous assurer que le client peut recevoir la réponse du serveur.

J'espère que ça aide.

15
costa

Faites en sorte que votre client basicHttpBinding soit identique à votre liaison au serveur. Il s'agit d'une erreur très commune consistant à ne modifier qu'une liaison au lieu d'une liaison serveur/client.

Si cela ne fonctionne pas, vous pouvez activer le traçage wcf: traçage wcf

Cela vous donnera plus d'indications sur le problème sous-jacent.

2
Peter

nous avions une boucle dans notre graphe d'objets qui revenait. Je sais que ce n’est probablement pas votre problème mais je l’ajoute ici au cas où quelqu'un d’autre aurait le même problème. Nous avions activé includeExceptionDetailInFaults, mais nous ne rencontrions l'erreur dans aucun client (notre application ou le client de test WCF). Heureusement, il est apparu dans les journaux du serveur, ce qui nous a permis de le trouver.

Nous avions Parent -> enfant et enfant -> parent pour la navigation dans les deux sens, nous devions rompre ce lien et au lieu de cela avoir parent -> enfant et l'enfant avait un identifiant pour rechercher le parent, puis l'erreur disparaissait.

J'espère que cela aide quelqu'un!

0
matao

Cette déclaration a résolu mon problème:

db.ContextConfiguration.ProxyCreationEnabled = false;
0
Dumindu

Ajoutez la configuration suivante à votre configuration de service wcf. Et voir le fichier c:\log\Traces.svclog. Mon exception a été jetée pour;

Une erreur s'est produite lors de la tentative de sérialisation du paramètre Le message InnerException "Enum value" 0 "n'est pas valide pour le type" ThyCams2014.XrmBase.new_filingstatu "et ne peut pas être sérialisé. Assurez-vous que les valeurs enum nécessaires sont présentes et sont marquées avec l'attribut EnumMemberAttribute si le type a le code DataContractAttribute attrienter herebute. '. Veuillez consulter InnerException pour plus de détails.

<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