2009-05-28 23 views
15

Tengo una aplicación de cliente desarrollada en .net enviando una solicitud al servicio wcf y se supone que debe enviar una respuesta .if tiempo de ejecución en 1 minuto, no hay error, si excede 1 minuto el error esWCF Servicio de Windows TimeOut

excepción interna: Esta operación solicitud enviada a net.tcp: // localhost: 18001/PitToPort/2008/01/30/StockpileService/tcp no recibió una respuesta dentro del tiempo de espera configurado (00:01:00)
El tiempo asignado a esta operación puede haber sido una porción de un tiempo de espera más largo. Esto puede deberse a que el servicio aún está procesando la operación o porque el servicio no pudo enviar un mensaje de respuesta. Por favor, considere la posibilidad de aumentar el tiempo de espera de la operación (por colada el canal/proxy para IContextChannel y establecer la propiedad OperationTimeout) y asegúrese de que el servicio es capaz de conectar con el cliente

¿Cómo aumentar el tiempo de espera y cómo? ¿Cuál es la mejor solución?

Respuesta

4

tengo añadir el siguiente código al código de la aplicación de servicio

system.transactions 
    defaultSettings timeout="00:30:00" 

con este código el servicio esperará 30 minutos para llegar proceso realiza en el servidor de base de datos y aumentar la

maxBufferSize="2147483647" 
maxReceivedMessageSize="2147483647" 
maxBufferPoolSize="2147483647" 

en atributos de enlace de cliente, entonces funciona bien.

Problema: El servicio está enviando una respuesta pero el búfer de cliente era menos anterior, aumenté al tamaño máximo de búfer.

+2

Parece que esto permitiría una solicitud de 2GB para atar un hilo por 30 minutos, convirtiéndolo en un objetivo fácil para DDOS. – Webveloper

14

El tiempo de espera se denomina "sendTimeout" y puede configurarlo en su sección de enlace en su archivo de configuración, o en código: su elección.

config:

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding sendTimeout="00:03:00" /> 
     </netTcpBinding> 
    </bindings> 

Esto establecerá el tiempo de espera de 3 minutos.

Marc

+1

¿Necesitamos escribir en ambos extremos (configuración de clien y configuración del servidor)? – rmdussa

+0

He intentado con "00:30:00" todavía me sale el error La conexión del socket se ha cancelado. Esto podría deberse a un error al procesar su mensaje o un tiempo de espera de recepción excedido por el host remoto o un problema de recursos de red subyacente. El tiempo de espera del socket local fue '00: 29: 57.8030000 '. – rmdussa

+1

pero realmente no es esperar 30 minutos, falla en 1 minuto – rmdussa

61

Tenga cuidado, este mensaje de error es una cadena repetitiva que WCF envía cuando no tiene ni idea de lo que sucedió. Realmente significa "mmh algo salió mal en la cadena pero no estoy muy seguro de qué, así que, aquí hay algunas trivialidades sobre la configuración, haz lo que quieras con ella".

LA MAYORÍA DE LAS VECES cuando recibe este mensaje no tiene nada que ver con los tiempos de espera reales. Puede ser cuotas (cantidad de objetos en el gráfico, tamaño total, longitud de la matriz) o algo que salió mal del lado del servidor, entre el momento en que su método de servicio arrojó un resultado y los bytes reales fueron enviados a través del cable. Por lo tanto, debe verificar su configuración (y no el tiempo de espera, excepto si realmente tuvo que esperar un minuto para obtener el error. Si obtuvo el error de inmediato, no tiene nada que ver con los tiempos de espera en absoluto).

Este mensaje inútil está en la parte superior de mi lista de molestias WCF.

+1

Estoy hablando de Practical Experience y 1. el tiempo es el tiempo de espera (procesamiento del servicio wcf en el servidor de base de datos, el procedimiento correspondiente tarda más de 2 min) 2. la lista de retornos de respuesta [] tamaño 400 elementos, si tratamos de devolver 100 elementos No hay error, si devolvemos la lista completa, entonces es un error arrojado, entonces realaizamos que esto se debe al buffer tamaño. Si no aumentamos el tiempo en el lado del servidor todavía no funciona, entonces en mi caso tengo que hacer ambos – rmdussa

+0

Estoy de acuerdo, es una repetición ya que encontrará soluciones diferentes para algunos y otros no. Para mí, era una aplicación de consola que estaba comenzando a probar un servicio que no es WCF (basado en Java). Tomó milisegundos en SoapUI, pero tomaría un mínimo de 3 segundos y algunas veces se agotaría el tiempo de espera con mi aplicación. Creo que Connection Pools y otras cosas pueden haber necesitado tiempo para inicializarse al iniciar la aplicación. Configuré SendTimeout en 5 minutos y está bien ahora. Nota: varias llamadas al servicio dentro de la aplicación (después de iniciarlo) ocurrieron en milisegundos. c.Endpoint.Binding.SendTimeout = new TimeSpan (0, 5, 0); – MikeTeeVee

0

Si sabe por qué el servidor tarda más de un minuto en responder al cliente, entonces debe extender OperationTimeout del canal (como se dice en el mensaje de error).

Salida esto, incluyendo un ejemplo de código al final: http://final-proj.blogspot.com/2009/09/wcf-timeouts.html

Buena suerte.

0

Aquí hay una solución mucho más simple ... simplemente establezca la propiedad directamente en el ClientBase actual. En otras palabras, primero agregue una referencia de servicio, inyitalícela, luego establezca la propiedad "InnerChannel.OperationTimeout"

NetUtilsWCF.SMTPDiagClient sClient = new NetUtilsWCF.SMTPDiagClient();

sClient.InnerChannel.OperationTimeout = new TimeSpan (0, 5, 0);

1

Experimenté este mismo error. Específicamente, la excepción de que he recibido fue:

System.ServiceModel.CommunicationException: La conexión de socket se abortado. Esto podría deberse a un error al procesar su mensaje o un tiempo de espera de recepción excedido por el host remoto o un problema de recursos de red subyacente. El tiempo de espera del socket local fue '00: 09: 59.9940000 '.

System.IO.IOException: La operación de escritura falló, vea la excepción interna .

System.ServiceModel.CommunicationException: La conexión del socket fue abortada.

Esto podría deberse a un error al procesar su mensaje o recibir un tiempo de espera excedido por el host remoto o una red subyacente problema de recursos.

El tiempo de espera del socket local era '00: 09: 59.9940000 '.

System.Net.Sockets.SocketException: Una conexión existente fue cerrada por la fuerza por el host remoto

La causa de mi problema era debido al tamaño del mensaje que se está enviando desde mi cliente de WCF al host de WCF. Aparentemente, el tamaño del mensaje era demasiado grande.

Para solucionar el problema, he cambiado el atributo de los hosts Web.Config maxReceivedMessageSize de 2097152 a 8000000 y el error ya no persiste.

Aquí es el atributo del Web.Config que me refiero:

<netTcpBinding> 
<binding name="NetTCPBinding" maxReceivedMessageSize="8000000"> 
.... 
</binding> 
</netTcpBinding> 

El tamaño del mensaje 8M que he elegido se basó en lo grande que yo "pienso" es el tamaño del mensaje. No sé de una forma de determinar explícitamente el tamaño del mensaje WCF real que pasa del cliente al host.

1

mira esto, para el tipo similar de error u tiene que establecer la propiedad OperationTine cabo http://www.codeproject.com/KB/WCF/WCF_Operation_Timeout_.aspx

+1

En resumen: Emitir el objeto devuelto por 'ChannelFactory .CreateChannel()' - que normalmente invocará sus operaciones en - IContextChannel' (sí, eso funciona) y establecer la propiedad 'OperationTimeout' en eso. – ygoe

-3

Si se enfrentan el problema después de corregir el archivo de configuración a continuación, puede que tenga que comprobar este atributo. "OperationContract(IsOneWay:=True)". Si omite el atributo IsOneWay:=True, puede causar este problema.

+1

Totalmente no aplicable, utilizado para métodos que no devuelven nada. – dudeNumber4

-1

Obtuve la misma excepción cuando uso la devolución de llamada. Funciona en prueba local (el cliente y el programa de servicio se ejecutan en la misma máquina) pero no funciona en el entorno del usuario (el programa de servicio se ejecuta en winserver 2008). El código del servidor se ha ejecutado de acuerdo con el registro. Creo que es debido a un problema de entorno o autoridad, pero no tengo idea de cómo manejarlo.

Cuestiones relacionadas