none
Error Web Service - Time Out RRS feed

  • Pregunta

  • Hola compañeros, tengo el siguiente caso:

    Tengo un web service (WCF) desarrollado en C# VSS 2017, el cual consume un servicio de un proveedor externo.

    cuando el servicio del proveedor externo genera un error de "Time Out". capturo la excepcion y guardo el log. 

    pero el problema es que las siguientes peticiones peticiones me generan el error de "Time Out", es como si quedara en memoria algo haciendo ruido que bloquea las peticiones siguientes. 

    si reinicio el servicio... (pues la solucion por ahora) ... todo vuelve a la normalidad. 

    por que queda mi servicio inhabilitado?

    como puedo evitar esto? 

    Gracias

    lunes, 17 de diciembre de 2018 22:19

Respuestas

  • hola

    que sucede sino asignas la config que defines en ObtenerBindingsHttps() dejando todos los valores por defecto ?

    podrias desde una aplicacion winform (o consola) de prueba, invocar varias veces al servicio externo a ver como responde, para evaluar si queda sin respuesta

    quizas un timeou del servicio externo haga que tu servicio tambien de timeout porque se vencen ambos plazos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Carlos_._Pardo martes, 18 de diciembre de 2018 14:12
    martes, 18 de diciembre de 2018 12:51

Todas las respuestas

  • hola

    >>pero el problema es que las siguientes peticiones peticiones me generan el error de "Time Out"

    pero quien genere el time out? el servicio de proveedor externo o tu servicio

    recuerda invocar al servicio de terceros usando un bloque using asi se descargan los objetos en memoria

    ademas se podria ver que sea una llamada asincrona, asi no bloquea el thread

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 17 de diciembre de 2018 23:21
  • Hola, puedes mostrar el código de cómo realizas las llamadas a ese servicio externo? Para asegurar lo que comenta Leandro. Hay que liberar los recursos, o bien si usas DI aplicar un scope determinado. 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 18 de diciembre de 2018 11:05
    Moderador
  • Esta es la forma basica, como estoy invocando el webService

    public RespuestaConsulta ConsultarWebServiceExterno()
            {
                PeticionConsulta consultaFactura = CrearPeticionConsulta();
    
                InterSoapClient clienteWebServiceExterno;
                RespuestaConsulta respuestaWS;
    
                clienteWebServiceExterno = new InterSoapClient(ObtenerBindingsHttps(), new EndpointAddress("...urlServicio..."));
    
                using (new OperationContextScope(clienteWebServiceExterno.InnerChannel))
                {
                    HttpRequestMessageProperty requestMessage = ObtenerRequestMessageProperty();
                    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
    
                    respuestaWS = clienteWebServiceExterno.MetodoConsulta(consultaFactura);
                }
    
                clienteWebServiceExterno.Close();
    
                return respuestaWS;
            }
    
            private HttpRequestMessageProperty ObtenerRequestMessageProperty()
            {
                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
                requestMessage.Headers["password"] = "...password...";
                requestMessage.Headers["token"] = "...token...";
                requestMessage.Headers["username"] = "...user...";
    
                return requestMessage;
            }
    
            private BasicHttpsBinding ObtenerBindingsHttps()
            {
                BasicHttpsBinding binding = new BasicHttpsBinding();
    
                binding.CloseTimeout = new TimeSpan(0, 1, 0);
                binding.OpenTimeout = new TimeSpan(0, 1, 0);
                binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
                binding.SendTimeout = new TimeSpan(0, 1, 10);
                binding.AllowCookies = false;
                binding.BypassProxyOnLocal = false;
                binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
                binding.MaxBufferSize = 655360;
                binding.MaxBufferPoolSize = 524288;
                binding.MaxReceivedMessageSize = 655360;
                binding.MessageEncoding = WSMessageEncoding.Text;
                binding.TextEncoding = Encoding.UTF8;
                binding.TransferMode = TransferMode.Buffered;
                binding.UseDefaultWebProxy = true;
                binding.ReaderQuotas.MaxDepth = 32;
                binding.ReaderQuotas.MaxStringContentLength = 2147483647;
                binding.ReaderQuotas.MaxArrayLength = 2147483647;
                binding.ReaderQuotas.MaxBytesPerRead = 2147483647;
                binding.ReaderQuotas.MaxNameTableCharCount = 2147483647;
    
                return binding;
            }

    martes, 18 de diciembre de 2018 12:45
  • hola

    que sucede sino asignas la config que defines en ObtenerBindingsHttps() dejando todos los valores por defecto ?

    podrias desde una aplicacion winform (o consola) de prueba, invocar varias veces al servicio externo a ver como responde, para evaluar si queda sin respuesta

    quizas un timeou del servicio externo haga que tu servicio tambien de timeout porque se vencen ambos plazos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Carlos_._Pardo martes, 18 de diciembre de 2018 14:12
    martes, 18 de diciembre de 2018 12:51
  • Hice este cambio y hasta ahora en las pruebas a trabajado bien...

    la variable "InterSoapClient clienteWebServiceExterno;"

    la coloque dentro de un bloque using, pues al fallar no pasaba por la linea donde se ejecutaba el metodo Close();

    		public RespuestaConsulta ConsultarWebServiceExterno()
            {
                PeticionConsulta consultaFactura = CrearPeticionConsulta();
                RespuestaConsulta respuestaWS = new RespuestaConsulta();
    
                using(clienteWebServiceExterno = new InterSoapClient(ObtenerBindingsHttps(), new EndpointAddress("...urlServicio...")))
    			{
    				using (new OperationContextScope(clienteWebServiceExterno.InnerChannel))
    				{
    					HttpRequestMessageProperty requestMessage = ObtenerRequestMessageProperty();
    					OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
    
    					respuestaWS = clienteWebServiceExterno.MetodoConsulta(consultaFactura);
    				}
    			}
    
                return respuestaWS;
            }
    

    Gracias

    martes, 18 de diciembre de 2018 14:12