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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top