No estoy seguro acerca de su primer ejemplo de código donde usa WebClient.UploadValues, no es suficiente para continuar, ¿podría pegar más de su código? En cuanto a su código de WebRequest, hay dos cosas en juego aquí:
Sólo está solicitando las cabeceras de la respuesta **, nunca se lee el cuerpo de la respuesta mediante la apertura y lectura (hasta el final) el ResponseStream. Debido a esto, el cliente de WebRequest deja la conexión abierta, esperando que solicite el cuerpo en cualquier momento. Hasta que no lea el cuerpo de la respuesta hasta su finalización (que automáticamente cerrará la transmisión por usted), limpie y cierre la transmisión (o la instancia de WebRequest) o espere a que el GC haga lo suyo, su conexión permanecerá abierta.
usted tiene una cantidad máxima predeterminada de activos conexiones a la misma cantidad de 2. Esto significa que se utiliza encima de sus dos primeras conexiones y luego no disponer de ellos por lo que no se le da a su cliente la oportunidad de completar la la próxima solicitud antes de que llegue a su tiempo de espera (que es de milisegundos, por cierto, por lo que ha establecido en 0,2 segundos - el valor predeterminado debería estar bien).
Si no desea que el cuerpo de la respuesta (o que acaba de cargado o publicado algo y no están esperando una respuesta), basta con cerrar el flujo, o el cliente, que cerrará la Stream para usted.
La forma más fácil de solucionar este problema es asegurarse de que utiliza el uso de bloques de objetos desechables:
for (int i = 0; i < ops1; i++)
{
Uri myUri = new Uri(site);
WebRequest myWebRequest = WebRequest.Create(myUri);
//myWebRequest.Timeout = 200;
using (WebResponse myWebResponse = myWebRequest.GetResponse())
{
// Do what you want with myWebResponse.Headers.
} // Your response will be disposed of here
}
Otra solución es permitir que 200 conexiones simultáneas con el mismo host. Sin embargo, a menos que usted está pensando en multi-hilo de esta operación por lo que había necesidad de múltiples conexiones concurrentes, esto no es realmente le ayudará a:
ServicePointManager.DefaultConnectionLimit = 200;
Cuando usted está recibiendo los tiempos de espera del código, lo mejor hacer es intentar recrear ese tiempo de espera fuera de tu código. Si no puede, el problema probablemente recae en su código.Usualmente uso cURL para eso, o simplemente un navegador web si es una simple solicitud GET.
** En realidad, en realidad, está solicitando el primer fragmento de datos de la respuesta, que contiene los encabezados HTTP, y también el inicio del cuerpo. Es por eso que es posible leer información del encabezado HTTP (como Content-Encoding, Set-Cookie, etc.) antes de leer desde la secuencia de salida. A medida que lee la secuencia, se recuperan más datos del servidor. La conexión de WebRequest al servidor se mantiene abierta hasta que llegue al final de esta secuencia (cerrándola de manera efectiva, ya que no se puede buscar), ciérrela manualmente o elimine. There's more about this here.
Por cierto, cuando publique código, intente publicar código real. Su código no compilaría: el constructor 'WebRequest' está' protected'. También sería conveniente si en lugar de "...", usara "// ...". –