Esos RFC "finos" exigen a todos los clientes de RFC que tengan 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>
(que 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?
Según http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"Cambiar la propiedad DefaultConnectionLimit no tiene ningún efecto en los objetos ServicePoint existentes; solo afecta a los objetos 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 la constante DefaultPersistentConnectionLimit".
Lo mejor es configurar el límite cuando instalo el WebClient, pero simplemente eliminar esta triste limitación mediante programación al comienzo de mi programa también estaría bien.
El servidor al que accedo no es un servidor web normal en Internet, sino que está bajo mi control y en la LAN local. Quiero hacer llamadas a API, pero no uso servicios web ni comunicación remota
Respuestas:
Con algunos consejos de aquí y en otros lugares, logré solucionar esto en mi aplicación anulando la clase 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; } }
fuente
System.Net.ServicePointManager.DefaultConnectionLimit
es una mejor solución, ya que no se puede asumir queWebRequest
es unHttpWebRequest
, por ejemplo, podría ser unFileRequest
.para los interesados:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(donde x es la cantidad deseada 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 mencionó anteriormente en la publicación.
fuente
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 , un ServicePoint instancia de se crea una WeakReference para retenerla dentro del ServicePointManager . Las solicitudes posteriores al administrador del mismo Uri devuelven la misma instancia. Si la conexión no se usa después, el GC la limpia.
fuente
ServicePoint
pierde (junto con su configuración) después deMaxIdleTime
Si encuentra que el objeto 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 fueron construidos para usar, por lo que puede hacerlo de esa manera. Si tiene suerte, todas sus solicitudes pueden terminar compartiendo el mismo ServicePoint, por lo que solo tendrá que hacerlo una vez.
No conozco ninguna forma global de cambiar el límite. Si modificó DefaultConnectionLimit lo suficientemente temprano en la ejecución, probablemente estaría bien.
Alternativamente, podría vivir con el límite de conexión, ya que la mayoría del software de servidor lo acelerará de todos modos. :)
fuente
Tenemos una situación relacionada con la configuración anterior en App.Config
Para que esto sea válido en una aplicación CONSOLE, agregamos la dll de referencia System.Configuration. Sin la referencia, lo anterior fue inútil.
fuente