.net - ¿Cómo puedo eliminar mediante programación el límite de 2 conexiones en WebClient?
http connection (5)
Con algunos consejos de aquí y de otros lugares, logré solucionar esto en mi aplicación anulando la clase de WebClient que estaba usando:
class AwesomeWebClient : WebClient {
protected override WebRequest GetWebRequest(Uri address) {
HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
req.ServicePoint.ConnectionLimit = 10;
return (WebRequest)req;
}
}
Esos "bien" RFC mandato de cada cliente de RFC que tienen cuidado de no utilizar más de 2 conexiones por host ...
Microsoft implementó esto en WebClient. Sé que se puede apagar con
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>
(se encuentra en http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )
Pero, ¿cómo puedo hacerlo programáticamente?
Accordin a http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"Cambiar la propiedad DefaultConnectionLimit no tiene efecto en los objetos existentes de ServicePoint, solo afecta a los objetos de ServicePoint que se inicializan después del cambio. Si el valor de esta propiedad no se ha establecido directamente o mediante la configuración, el valor predeterminado es DefaultPersistentConnectionLimit constante".
Me gustaría configurar el límite cuando instaure WebClient, pero eliminar esta triste limitación programáticamente al inicio de mi programa estaría bien también.
El servidor al que accedo no es un servidor web regular en Internet, sino bajo mi control y en el LAN local. Quiero hacer llamadas a la API, pero no uso servicios web o remotos
Esta solución le permite cambiar el límite de conexión en cualquier momento :
private static void ConfigureServicePoint(Uri uri)
{
var servicePoint = ServicePointManager.FindServicePoint(uri);
// Increase the number of TCP connections from the default (2)
servicePoint.ConnectionLimit = 40;
}
La primera vez que alguien llama a este FindServicePoint , se FindServicePoint una instancia de ServicePoint se crea una WeakReference para mantenerla dentro del ServicePointManager . Las solicitudes posteriores al gerente para el mismo Uri devuelven la misma instancia. Si la conexión no se usa después, el GC lo limpia.
Si encuentra que el objeto de ServicePoint está siendo utilizado por su WebClient, puede cambiar su límite de conexión. Los objetos HttpWebRequest tienen un descriptor de acceso para recuperar el que se construyó para usar, por lo que podría hacerlo de esa manera. Si tiene suerte, todas sus solicitudes podrían terminar compartiendo el mismo ServicePoint, por lo que solo tendría que hacerlo una vez.
No conozco ninguna forma global de cambiar el límite. Si modificó el DefaultConnectionLimit lo suficientemente temprano en la ejecución, probablemente esté bien.
Alternativamente, podría vivir con el límite de conexión, ya que la mayoría del software de servidor lo va a estrangular de todos modos. :)
Tenemos una situación con respecto a la pieza de configuración anterior en App.Config
Para que esto sea válido en una Aplicación CONSOLA, agregamos el System.Configuration reference dll. Sin la referencia, lo anterior fue inútil.
para aquellos interesados:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(donde x es su número deseado de conexiones)
sin necesidad de referencias adicionales
solo asegúrese de que esto se llame ANTES de que se cree el punto de servicio como se menciona anteriormente en la publicación.