2010-05-04 15 views
6

Abbiamo un servizio WCF (BasicHttpBinding) che fallirà sempre dopo 30 secondi. Chiamate inferiori ai 30 secondi completate senza errori. Nulla più di 30 secondi, fallirà con un'eccezione 502 Gateway:Le chiamate di servizio WCF falliscono sempre dopo 30 secondi con (502) Gateway errato

System.Net.WebException: The remote server returned an error: (502) Bad Gateway.

Ma ancora la chiamata WCF continua a funzionare in background (e alla fine completa). Abbiamo confermato che BasicHttpBinding - Binding - sendTimeout (in web.config) è maggiore di 30 secondi (in realtà impostato su 5 minuti). Lo abbiamo confermato sia sul client che sul server.

Ecco la completa analisi dello stack:

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (502) Bad Gateway. ---> System.Net.WebException: The remote server returned an error: (502) Bad Gateway. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding) 
    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) 

Tutte le idee in cui questo 30 secondi "timeout" viene da o perché viene restituito un errore 502 Bad Gateway?

SOLUZIONE: Si utilizza il modulo di instradamento della richiesta di applicazione IIS7 con impostazioni proxy proprie. Le impostazioni Proxy hanno un timeout predefinito di 30 secondi. Aumentare questo a 600 secondi (10 minuti) ha risolto il nostro problema. L'errore di Bad Gateway non è completamente corretto ma WCF Trace Viewer (vedi risposta) ha aiutato a capire che il problema non era il servizio stesso, ma un problema tra il client e il servizio wcf.

risposta

5

Si consiglia di guardare provare a modificare gli altri valori di timeout di configurazione:

CloseTimeout, OpenTimeout, recieveTimeout.

Vedi this MSDN post per informazioni sulle voci di configurazione, sintesi di seguito:

Client side:

  • SendTimeout is used to initialize the OperationTimeout, which governs the whole interaction for sending a message (including receiving a reply message in a request-reply case). This timeout also applies when sending reply messages from a CallbackContract method.
  • OpenTimeout and CloseTimeout are used when opening and closing channels (when no explicit timeout value is passed).

Server side:

  • Send, Open, and Close Timeout same as on client (for Callbacks).
  • ReceiveTimeout is used by ServiceFramework layer to initialize the session-idle timeout.

aggiunto:

L'unica altra cosa che posso suggerire è quello di utilizzare il servizio WCF Trace Viewer per andare a fondo di cosa sta causando il problema. Vedi questo SO Post se hai bisogno di dettagli su come usarlo.

+0

Abbiamo provato a incrementare closeTimeout, openTimeout e receiveTimeout a 5 minuti (su client e server) e vedere ancora il problema. –

+0

Grazie per le informazioni sul servizio di tracciamento del servizio WCF. L'ho usato per raccogliere una traccia sia sul client che sul server, ma tutto quello che vedo è che il server sta completando correttamente, ma il client finisce con "Risposta HTTP errata ricevuta" con il messaggio interno "Il server remoto restituito una risposta inaspettata: (502) Bad Gateway. " Il server viene completato dopo 42 secondi e il client riceve l'errore a 31 secondi.Sono sempre 31 secondi per il cliente. –

+0

Capito. Stiamo utilizzando il modulo di routing delle richieste di applicazioni IIS7 che dispone di impostazioni Proxy una delle quali era un timeout di 30 secondi. Utilizzo del servizio di tracciamento del servizio WCF mi ha aiutato a capire che il servizio WCF non rappresentava il problema, ma qualcosa tra il client e il servizio. –

0

Ho avuto questo stesso problema oggi stesso. Il caricamento di un file su un servizio web WCF da un'app SL4 continuava a generare un'eccezione ConnectionTimeout dopo 30 secondi.

ho trovato la causa del problema sia l'uso del metodo WebRequest.RegisterPrefix come raccomandato da Microsoft per superare guasti gestione delle eccezioni in Silverlight:

bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 

Vedi http://msdn.microsoft.com/en-us/library/ee844556(v=vs.95).aspx

1

IIS -> Avanzate Impostazioni -> Limiti di connessione

Aumentare quel numero (in secondi) fino alla quantità desiderata.

Spero che questo aiuti tutti i googler là fuori!

Problemi correlati