¿Cómo puedo quitar mediante programación el límite de 2 conexión en WebClient
-
21-08-2019 - |
Pregunta
Los "finos" Rfc mandato de cada RFC-cliente que tenga cuidado de no usar más de 2 conexiones por el ejército...
Microsoft implementó esta en WebClient.Sé que puede ser desactivado 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 mediante programación?
Accordin a http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"El cambio de la DefaultConnectionLimit propiedad no tiene ningún efecto sobre la existente ServicePoint objetos;sólo afecta a los objetos que se ServicePoint inicializa después del cambio.Si el valor de esta propiedad no ha sido conjunto, ya sea directamente o a través de la configuración, el valor predeterminado es la constante DefaultPersistentConnectionLimit."
Me gustaría que la mejor manera de configurar el límite de cuando me instancias el WebClient, pero sólo la eliminación de esta triste limitación mediante programación en el inicio de mi programa estaría bien, demasiado.
El servidor de acceso no es una regular servidor web en el internet, pero bajo mi control y en la lan local.Yo quiero hacer la API de llamadas, pero yo no uso de webservices o remoting
Solución
Con algunos consejos de aquí y en otros lugares que lograron solucionar este problema en mi solicitud 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;
}
}
Otros consejos
para los interesados:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(donde x es el número deseado de conexiones)
sin necesidad de referencias adicionales
acaba de asegurarse de que esto se llama antes de crear el punto de servicio como se mencionó anteriormente en el puesto.
Esta solución le permite cambiar el límite de conexión a 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 esto FindServicePoint , un ServicePoint se crea instancia y un WeakReference se crea para aferrarse a ella dentro de la ServicePointManager . Las solicitudes posteriores al gestor de la misma Uri devuelven la misma instancia. Si la conexión no se utiliza después, la GC lo limpia.
Si encuentra que el objeto ServicePoint que utiliza su cliente Web, puede cambiar su límite de conexiones. objetos HttpWebRequest tienen un descriptor de acceso para recuperar la que se construyeron a utilizar, por lo que podrían hacerlo de esa manera. Si tiene suerte, todas sus peticiones podrían terminar compartiendo el mismo ServicePoint por lo que sólo tendría que hacerlo una vez.
No sé de ninguna manera global para cambiar el límite. Si ha alterado la DefaultConnectionLimit lo suficientemente temprano en ejecución, probablemente estaría bien.
Alternativamente, usted podría vivir con el límite de conexión, ya que la mayor parte del software de servidor va a estrangular a usted de todos modos. :)
Tenemos una situación con respecto a la pieza anterior de la configuración en app.config
Para que esto sea válido en una aplicación de consola, añadimos la DLL de referencia System.Configuration. Sin la referencia, lo anterior era inútil.