2009-10-05 22 views
77

Potrebbe sembrare una domanda stupida, ma tutto in WCF sembra molto più complicato che in asmx, come posso aumentare il timeout di un servizio svc?Servizio WCF, come aumentare il timeout?

Ecco quello che ho finora:

<bindings> 
     <basicHttpBinding> 
     <binding name="IncreasedTimeout" 
      openTimeout="12:00:00" 
      receiveTimeout="12:00:00" closeTimeout="12:00:00" 
      sendTimeout="12:00:00"> 
     </binding> 
     </basicHttpBinding> 
</bindings> 

E poi il mio punto finale viene mappato su come questo:

<endpoint address="" 
    binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout" 
      contract="ServiceLibrary.IDownloads"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
      </endpoint> 

L'errore esatto che sto ottenendo:

Il canale richiesta è scaduta fuori mentre aspetta una risposta dopo 00: 00: 59.9990000. Aumentare il valore di timeout passato alla chiamata su Richiesta o aumentare il valore SendTimeout sul Binding. Il tempo assegnato a questa operazione potrebbe essere stato una parte di un timeout più lungo.

Nella prova WCF client, v'è un'icona di configurazione che contiene la configurazione fase di esecuzione del mio servizio:

Come si può vedere i suoi non gli stessi valori come ho impostato per esso? Che cosa sto facendo di sbagliato?

<bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm=""> 
          <extendedProtectionPolicy policyEnforcement="Never" /> 
         </transport> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 

risposta

23

Il timeout da impostare a livello di client, quindi la configurazione stavo installando nel web.config non ha avuto effetto, lo strumento di test WCF ha una propria configurazione e non v'è dove è necessario per impostare il timeout.

+1

beh, sì - in genere, deve essere impostato sia sul client che sul server, anche - ad es. in caso di "inactivityTimeout" su sessioni e cose del genere. –

+7

JL: puoi mostrare che cosa hai fatto in modo esatto? Sto avendo lo stesso problema –

+0

Se si utilizza il 'client di test WCF', fare clic destro su 'File di configurazione' nella struttura dei servizi, quindi fare clic su 'Modifica con SvcConfigEditor' e modificare il timeout all'interno dei collegamenti. – Radderz

154

Nella configurazione di legame, ci sono quattro valori di timeout si può modificare:

<bindings> 
    <basicHttpBinding> 
    <binding name="IncreasedTimeout" 
      sendTimeout="00:25:00"> 
    </binding> 
    </basicHttpBinding> 

La più importante è la sendTimeout, che dice quanto tempo il cliente attenderà una risposta dal tuo servizio WCF . Puoi specificare hours:minutes:seconds nelle tue impostazioni: nel mio esempio, ho impostato il timeout su 25 minuti.

Il openTimeout come suggerisce il nome è la quantità di tempo che si è disposti ad attendere quando si apre la connessione al servizio WCF. Allo stesso modo, lo closeTimeout è il periodo di tempo in cui si chiude la connessione (disporre del proxy client) che si aspetterà prima che venga generata un'eccezione.

Il receiveTimeout è un po 'come uno specchio per il sendTimeout - mentre il timeout di invio è la quantità di tempo si attendere una risposta dal server, il receiveTimeout è la quantità di tempo che ti do il programma e ricevere ed elaborare la risposta dal server.

Nel caso in cui si inviino i messaggi "normali", entrambi possono essere piuttosto brevi, in particolare lo receiveTimeout, dal momento che la ricezione di un messaggio SOAP, la decrittografia, il controllo e la deserializzazione dovrebbero richiedere quasi del tempo. La storia è diversa con lo streaming: in tal caso, potrebbe essere necessario più tempo sul client per completare effettivamente il "download" dello stream che si ottiene dal server.

C'è anche openTimeout, receiveTimeout e closeTimeout. Il MSDN docs on binding ti dà ulteriori informazioni su ciò che questi sono per.

per ottenere una presa sul serio su tutti i intricasies di WCF, che vi consiglio vivamente di acquistare il "Learning WCF" libro di Michele Leroux Bustamante:

Learning WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

e anche trascorrere un po 'di tempo a guardare il suo 15 -part "serie screencast" WCF Top to Bottom - altamente raccomandata!

Per argomenti più avanzati, si consiglia di consultare il manuale di servizi di Juwal Lowy Programming WCF. ha bisogno

configurazione

Programming WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

ho cercato di aggiungere le sezioni vincolanti alle nel web.config, ma la sua lanciando un errore ora .... eventuali passaggi aggiuntivi I ho perso ... –

+0

Ho anche cambiato l'endpoint nel mio servizio per

+0

Penso di averlo capito - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout" –

4

Recentemente si è verificato lo stesso errore, ma è stato in grado di risolverlo assicurandosi di chiudere ogni chiamata del client wcf. es.

WCFServiceClient client = new WCFServiceClient(); 
//More codes here 
// Always close the client. 
client.Close(); 

o

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    //More codes here 
} 
+9

Non utilizzare l'approccio 'using': http: // omaralzabir.com/do-not-use-using-in-wcf-client/ –

+0

Nei commenti di http://omaralzabir.com/do-not-use-using-in-wcf-client, ci sono esempi di come fermarsi usa 'using' mentre non stai eliminando un oggetto canale guasto. Ecco un altro blogger con un approccio più compatibile con i blocchi 'using': http://erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper/. – Greg

13

Il modo migliore è quello di cambiare qualsiasi impostazione che si desidera nel codice.

Partenza il seguente esempio:

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30); 
} 
+0

ottimo consiglio, grazie – ukie

Problemi correlati