2013-10-22 16 views
14

sto il recupero dei dati da un servizio Web WCF e quando i dati sono più di 0,2 milioni di dischi ottengo un'eccezione che è come sotto:System.ServiceModel.CommunicationException: La connessione sottostante chiusa

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) 

My Web .config appare così:

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

Sono sicuro che il mio servizio Web sta recuperando i dati dal DB. ma non è in grado di trasferire sul mio sito web da dove ho avviato la chiamata. Grazie in anticipo per qualsiasi aiuto.

+0

Aumentare il timeout della connessione nel file di configurazione. – gleng

+0

Aumentare maxBufferSize, maxReceivedMessageSize nei binding menzionati in Web.config –

risposta

15

Ho avuto di recente lo stesso problema con un servizio Wcf all'interno di un'app web .Net 4.0. Ho aumentato il valore maxItemsInObjectGraph e il server non ha più lanciato l'eccezione. La documentazione here dice che il massimo predefinito è Int32.MaxValue ma penso che non è corretto, il valore massimo è 65535.

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

L'altra cosa che puoi fare è abilitare la traccia. Questo è un esempio di quello che ho in 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> 

Se si fa doppio clic sul Traces.svclog, Windows dovrebbe aprire il Microsoft Service Trace Viewer.

Se si esegue il test del servizio con il client di prova WCF Microsoft, assicurarsi di modificare la configurazione client predefinita in modo che corrisponda alle impostazioni del server (che include il comportamento dell'endpoint client) per assicurarsi che il client possa ricevere la risposta dal server.

Spero che questo aiuti.

+0

Ho avuto un problema simile a OP, aggiungendo '' risolto il problema per me. –

+1

Anch'io ho avuto un problema simile. Usando il tracelog del servizio ho trovato un errore di serializzazione della mia classe DTO ... – GiveEmTheBoot

+0

la documentazione nel collegamento è la classe System.Runtime.Serialization. Ecco il link al comportamento del servizio, che mostra il massimo è 65536 http://msdn.microsoft.com/en-us/library/ms731809(v=vs.100).aspx – mmeasor

2

Rendi il client baseHttpBinding uguale al binding del server. Si tratta di un errore comune verry per modificare solo un binding anziché l'associazione server e client.

Se questo non funziona è possibile attivare WCF tracciamento: wcf tracing

che vi darà ulteriori delucidazioni in quello che il problema è subalterno.

0

avevamo un ciclo nel nostro oggetto grafico che stava tornando. So che probabilmente non è un tuo problema, ma lo aggiungo qui nel caso in cui qualcun altro abbia lo stesso problema. Abbiamo incluso includeExceptionDetailInFaults ma non abbiamo riscontrato l'errore in alcun client (la nostra applicazione o il client di test WCF). Fortunatamente è apparso nei log del server, quindi siamo riusciti a trovarlo in quel modo.

Abbiamo avuto padre -> figlio e figlio -> padre per la navigazione a due vie, abbiamo dovuto interrompere quel collegamento e invece genitore -> figlio, e il bambino aveva un ID per cercare il genitore, quindi l'errore è andato lontano.

Spero che questo aiuti qualcuno!

0

Aggiungere la seguente configurazione alla configurazione del servizio wcf. E vedi c: \ log \ Traces.svclog file. La mia eccezione è stata lanciata per;

C'è stato un errore durante il tentativo di serializzare parametro Il messaggio era InnerException 'valore Enum '0' è valida per il tipo 'ThyCams2014.XrmBase.new_filingstatu' e non può essere serializzato. Assicurarsi che siano presenti i valori enum necessari e che siano contrassegnati con l'attributo EnumMemberAttribute se il tipo ha codice attriente DataContractAttribute qui. '. Si prega di consultare InnerException per maggiori dettagli.

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