.net - example - Tiempo de espera de HttpWebRequest y ReadWriteTimeout: ¿Qué significan estos para la conexión TCP subyacente?
webrequest c# parameters (3)
.Timeout = tiempo empleado en intentar establecer una conexión (sin incluir el tiempo de búsqueda) .ReadWriteTimeout = tiempo empleado en intentar leer o escribir datos después de establecer la conexión
Creo que entiendo las diferencias prácticas entre HttpWebRequest.Timeout
y HttpWebRequest.ReadWriteTimeout
. Sin embargo, estoy buscando una mayor claridad sobre la diferencia entre estos dos tiempos de espera, incluyendo lo que significan estos valores con respecto a la conexión TCP / buffers / estado subyacente, si corresponde .
Por ejemplo, ¿estos tiempos de espera se usan solo durante la inicialización de la conexión TCP, o son solo valores administrados para vigilar la conexión no administrada?
¿Cuáles son los escenarios cliente-servidor en términos de TCP donde cada uno de estos tiempos de espera se aplicaría o no?
Creo que tienes la primera parte de tu respuesta de @Donal Lafferty. Aquí hay un resumen rápido de todos modos.
HttpWebRequest.Timeout : el tiempo antes de que el servidor tenga que aceptar la solicitud del cliente. Tenga en cuenta que esto no incluye el tiempo de resolución de DNS, que es administrado por ServicePointManager.
HttpWebRequest.ReadWriteTimeout : el tiempo antes de que el cliente tenga que recibir todo el cuerpo de la respuesta del servidor. Tenga en cuenta que este tiempo de espera se inicia solo después de que el servidor acepta la solicitud.
La respuesta a tu segunda pregunta es doble.
1. Solicitud sincrónica:
Las conexiones TCP están cerradas en el tiempo de espera, todos felices.
2. Solicitud asíncrona:
Estos tiempos de espera no tienen ningún efecto. Si no tiene un mecanismo adecuado para administrar los tiempos de espera, las conexiones TCP permanecerán abiertas.
Esa es precisamente la razón por la que abortas la solicitud registrando un tiempo de espera en AsyncWaitHandle, como se muestra en el siguiente ejemplo:
Este problema se ha debatido en otra pregunta, consulte Ajuste del tiempo de espera de conexión HttpWebRequest en C # . La discusión hizo girar mi cabeza, así que voy a ofrecer mi resumen.
Aunque, MSDN explica que la propiedad HttpWebRequest.Timeout se aplica a las llamadas HttpWebRequest.GetResponse
y HttpWebRequest.GetRequestStream
, la descripción es un poco confusa.
Jim Mischel es más útil: el tiempo de Timeout
"es el momento para que el servidor responda a una solicitud, no la cantidad de tiempo para esperar a que el servidor responda y envíe toda la información". Por lo tanto, Timeout
cubre el establecimiento de una conexión de trabajo. Para cargas útiles grandes, esto no implica que la solicitud / respuesta esté completa.
ReadWriteTimeout
aplica a las operaciones de lectura o escritura en flujos que se transmiten a través de la conexión. Por ejemplo, cuando escribe en la secuencia devuelta por GetRequestStream. La conexión ya está establecida, pero existe el riesgo de que se rompa. Por ejemplo, la conexión de red se cae.
El enlace de Jim Mischel tiene algunos consejos muy buenos sobre qué valores establecer estos tiempos de espera. Es decir, el valor predeterminado para ReadWriteTimeout
es demasiado largo.