2010-05-04 20 views
6

Tenemos un servicio WCF (BasicHttpBinding) que siempre falla después de 30 segundos. Las llamadas de menos de 30 segundos se completan sin error. Algo más de 30 segundos se producirá un error con una excepción 502 Pasarela incorrecta:WCF Las llamadas de servicio siempre fallan después de 30 segundos con (502) Bad Gateway

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

Pero sin embargo, la llamada WCF continúa funcionando en segundo plano (y con el tiempo se completa). Hemos confirmado que BasicHttpBinding - Binding - sendTimeout (en web.config) tiene más de 30 segundos (en realidad está configurado en 5 minutos). Confirmamos esto tanto en el cliente como en el servidor.

Aquí está la traza completa:

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) 

Alguna idea donde esta 30 segundos "tiempo de espera" viene de o por qué se devuelve un error 502 Pasarela incorrecta?

SOLUCIÓN: Estamos utilizando el Módulo de enrutamiento de solicitud de aplicación IIS7 que tiene su propia configuración de Proxy. La configuración Proxy tiene un tiempo de espera predeterminado de 30 segundos. Aumentar esto a 600 segundos (10 minutos) resolvió nuestro problema. El error de Bad Gateway no es del todo correcto, pero WCF Trace Viewer (ver respuesta) ayudó a ver que el problema no era el servicio en sí, sino un problema entre el cliente y el servicio wcf.

Respuesta

5

Es posible que desee ver intente modificar los valores de tiempo de espera de otros config:

CloseTimeout, OpenTimeout, recieveTimeout.

Ver this MSDN post para obtener información sobre los elementos de configuración, resumen a continuación:

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.

añadido:

La única otra cosa que puedo sugerir es utilizar el servicio de WCF Visor de seguimiento para llegar a la parte inferior de ¿Qué está causando el problema? Consulte esto SO Post si necesita detalles sobre cómo usarlo.

+0

Hemos intentado aumentar closeTimeout, openTimeout y receiveTimeout a 5 minutos (en el cliente y el servidor) y todavía vemos el problema. –

+0

Gracias por la información en WCF Service Trace Viewer. Lo usé para recopilar un rastro tanto en el cliente como en el servidor, pero lo único que veo es que el servidor está completando correctamente, pero el cliente termina con una "Respuesta HTTP mal recibida" con el mensaje interno "El servidor remoto devuelto una respuesta inesperada: (502) Bad Gateway ". El servidor finaliza después de 42 segundos y el cliente obtiene el error en 31 segundos.Siempre es 31 segundos para el cliente. –

+0

Lo descubrí. Estamos utilizando el Módulo de enrutamiento de solicitud de aplicación IIS7, que tiene una configuración Proxy, una de las cuales fue un tiempo de espera de 30 segundos. El uso de WCF Service Trace Viewer me ayudó a comprender que el servicio WCF no era el problema sino algo intermedio entre el cliente y el servicio. –

0

Hoy me he topado con este mismo problema. La carga de un archivo a un servicio web WCF desde una aplicación SL4 siguió generando una excepción ConnectionTimeout después de 30 segundos.

he encontrado la causa del problema a ser el uso del método WebRequest.RegisterPrefix según lo recomendado por Microsoft para superar Falla El manejo de excepciones en Silverlight:

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

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

1

IIS -> Avanzado Configuración -> Límites de conexión

Aumente ese número (en segundos) hasta la cantidad deseada.

Espero que esto ayude a cualquier Googlers por ahí!

Cuestiones relacionadas