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.
Abbiamo provato a incrementare closeTimeout, openTimeout e receiveTimeout a 5 minuti (su client e server) e vedere ancora il problema. –
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. –
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. –