¿Cómo puedo eliminar mediante progtwigción el límite de 2 conexiones en WebClient?

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:

        

(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 progtwig 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

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; } } 

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.

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 crea una instancia de ServicePoint y 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.