2009-08-25 14 views
8

Sto chiamando un servizio Web WCF localmente (o in remoto) che funziona correttamente con piccole quantità di dati (circa 25 righe di < 1K di dati ea). Ma quando i dati diventano più grandi (circa 300 righe) il servizio web ha esito negativo. Di seguito sono riportati Eccezione, Eccezione interna e Traccia stack dall'eccezione interna.Il servizio Web WCF non è in grado di ricevere grandi dati

Anche il servizio sembra richiedere insolitamente una lunga esecuzione locale (aggiungo questo perché potrebbe darti qualche suggerimento nel risolvere). Ottenere la grande quantità di dati richiede 3s lato server e il piccolo di dati prende 1 s lato server. Tuttavia, l'esecuzione del servizio Web (localmente) per ottenere il minor numero di dati richiede 24 secondi.

Ho anche incluso le informazioni di binding dall'app.config dall'applicazione di test del mio client.

========= =========== informazioni vincolanti

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IFormsService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="02:00:00" sendTimeout="00:02:00" 
      allowCookies="false" bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="1000000000" 
         maxArrayLength="1000000000" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
      <transport clientCredentialType="None" 
         proxyCredentialType="None" realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint 
     address="http://monica-pc/TrialIQSvc/FormsService.svc/FormsService/FormsService.Svc" 
     binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_IFormsService" 
     contract="WebService.IFormsService" name="BasicHttpBinding_IFormsService" /> 
</client> 

ECCEZIONE ========= dATI =============

**Exception**: An error occurred while receiving the HTTP response to http://monica-pc/TrialIQSvc/FormsService.svc/FormsService/FormsService.Svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. 

**Inner Exception**: The underlying connection was closed: An unexpected error occurred on a receive. 
    **Stack trace**: 
Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 
    at System.ServiceModel.Channels.HttpChannelFactory.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.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at Test.WebService.IFormsService.GetFormGroupInstance(String formGroupId, String subjectId, String userId) 
    at Test.WebService.FormsServiceClient.GetFormGroupInstance(String formGroupId, String subjectId, String userId) in G:\SVNTrialIQ\trunk\Common\trunk\source\Forms\Test\Service References\WebService\Reference.cs:line 59 
    at Test.Form1.btnInstanceInfo_Click(Object sender, EventArgs e) in G:\SVNTrialIQ\trunk\Common\trunk\source\Forms\Test\Form1.cs:line 408 

risposta

2

Per ottenere le informazioni di errore esteso provare a utilizzare SvcTraceViewer.

+0

Sì! Questo è stato. Non è stato possibile visualizzare un registro di traccia nella mia macchina di sviluppo (Vista). Ma, quando guardo l'interfaccia di IIS 7 fornita con Vista, devo ammettere che mi fa sentire come se non avessi mai toccato un computer prima nella mia vita. Quindi non ho fatto troppa risoluzione dei problemi. –

+0

Tuttavia, l'esecuzione del codice di traccia nel web.config sul mio server Win2003 ha rivelato che si trattava di un errore di tipo dovuto all'ereditarietà, che è piuttosto non correlato, ma è descritto bene qui: http://developers.de/blogs/damir_dobric/archive /2009/03/24/about-quot-knowntypeattribute-quot-example.aspx –

0

potrebbe essere che si sta perdendo un po 'di configurazione sul lato server

2

C'è un certo numero di cose che potrebbero andare male.

Prima di tutto, come già suggerito da "darin", prova ad attivare il tracciamento del messaggio e vedere cosa produce.

Secondo: si potrebbe essere in un timeout. Hai detto che il tuo piccolo set di dati ha richiesto circa 24 secondi per tornare, il tuo set di dati più grande è 12 volte più grande (300 vs 25 linee), quindi potrebbero impiegare 288 secondi - ma il tuo sendTimeout è impostato su 2 minuti - quindi potrebbe essere la ragione. Provare ad aumentare questa impostazione per diciamo 10 minuti - che dovrebbe essere tutto il tempo:

<binding name="BasicHttpBinding_IFormsService" 
      sendTimeout="00:10:00" 

Se questo non lo risolve - si potrebbe tentare di utilizzare lo streaming al fine di spostare indietro le grandi quantità di dati:

<binding name="BasicHttpBinding_IFormsService" 
     transferMode="StreamedResponse"> 

Fintanto che solo le risposte sono grandi, dovrebbe funzionare. Naturalmente, dovresti rearchitect il tuo client chiamando il servizio un po 'per gestire lo streaming (creare un contratto di operazione = metodo di servizio che restituisce un valore Stream come valore di ritorno e utilizzare il flusso per leggere i dati in blocchi dal server) . Se questo è uno scenario comune per te, potrebbe funzionare e valere la pena (e ti permetterebbe di ridurre di nuovo le dimensioni del buffer, per evitare un attacco denial-of-service inondando di messaggi enormi).

Vedere un grande intro to WCF message streaming per ulteriori informazioni sullo streaming.

E se nulla aiuta - torna e facci sapere!

Marc

+0

Guardo l'articolo in streaming. Grande riferimento! La messa a punto delle prestazioni è il mio prossimo passo. –

0

Prova questa: nella nella sezione system.web. Imposta l'attributo maxRequestLength.

<httpRuntime executionTimeout="90" maxRequestLength="1048576" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100"/> 
0

Questo errore può essere dovuto alla mancata corrispondenza del contratto. Prendere in considerazione i tre strati di applicazione qui sotto ...

UI Layer        
    |  
Process Layer 
    | 
Data Access Layer     
-> Contract Between Process and UI layer has the same enum with missing (Onhold = 3). Enum: Start = 1, Stop = 2. 
-> Contract Between Data Access And Process layer has enum Enum: Start = 1,Stop = 2,Onhold = 3. 

In questo caso avremo lo stesso errore in risposta livello di processo.

Lo stesso errore si riscontra in altre mancate corrispondenze contrattuali in un'applicazione multistrato.

Problemi correlati