c# - La operación ha excedido el tiempo de espera en System.Net.HttpWebRequest.GetResponse() al enviar una gran cantidad de solicitudes a un host
timeout operation (1)
ServicePointManager.DefaultConnectionLimit
limita el número de solicitudes web salientes a un servidor determinado.
El valor predeterminado es generalmente
2 o 10
.
Si realiza 50 llamadas paralelas a ese servicio web, debe establecer
ServicePointManager.DefaultConnectionLimit
(al inicio de la aplicación) en un número mayor (por ejemplo,
40-50
).
Además, no está llamando a
Close
o
Dispose
a
request
.
Debe hacer esto, o dejar que el
using
cuide por usted.
Estoy enviando una gran cantidad de solicitudes simultáneas a un servicio web en particular con diferentes datos. Para lograr esto, he creado una serie de hilos (alrededor de 50 en número). El número total de solicitudes por minuto puede aumentar hasta 10000. La aplicación en forma de servicio de Windows funciona bien durante unos minutos y luego se encuentra un error de tiempo de espera de la operación.
He intentado con los sospechosos habituales, como aumentar DefaultConnectionLimit y cerrar el objeto de respuesta web. Dado que las solicitudes no toman mucho tiempo en el servidor, también configuré el tiempo de espera de solicitud y ReadWriteTimeout en 5 segundos. A continuación se muestra el fragmento de código que se llama repetidamente por diferentes hilos.
// Below line is executed at the start of application
ServicePointManager.DefaultConnectionLimit = 15000;
// Below code is executed at repeatedly by different threads
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Host = hostName;
request.Proxy = null;
request.UserAgent = "Windows Service";
byte[] bytes = new byte[0];
if (body != null)
{
bytes = System.Text.Encoding.ASCII.GetBytes(body);
request.ContentType = "text/xml; encoding=''utf-8''";
request.ContentLength = bytes.Length;
}
request.Method = "POST";
request.Timeout = 5000;
request.ReadWriteTimeout = 5000;
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));
request.CookieContainer = this.cookieContainer;
if (body != null)
{
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
}
HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
responseText = streamReader.ReadToEnd();
}
httpResponse.Close();