Pergunta

Essas RFCs "finos" mandato de todos os RFC-cliente que tem cuidado de não usar mais de 2 conexões por host ...

Microsoft implementou isso em WebClient. Eu sei que ele pode ser desligado com

App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
 <system.net> 
  <connectionManagement> 
   <add address="*" maxconnection="100" /> 
  </connectionManagement> 
 </system.net> 
</configuration> 

(encontrado na http : //social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )

Mas como posso fazê-lo por meio de programação?

Accordin para http://msdn.microsoft.com/en-us /library/system.net.servicepointmanager.defaultconnectionlimit.aspx

"Alterar a propriedade DefaultConnectionLimit não tem efeito sobre existente ServicePoint objetos; ela afeta apenas objetos ServicePoint que são inicializado após a mudança. Se o valor dessa propriedade não foi definir, quer directamente ou através de uma configuração, o valor padrão do DefaultPersistentConnectionLimit constante ".

Eu gostaria melhor para configurar o limite quando eu instanciar o WebClient, mas apenas remover essa triste limitação programaticamente no início da minha programm seria bom, também.

O acesso ao servidor não é um servidor web regular na internet, mas sob o meu controle e na lan local. Eu quero fazer API-chamadas, mas eu não use webservices ou comunicação remota

Foi útil?

Solução

Com algumas dicas de aqui e em outros lugares eu consegui corrigir isso no meu aplicativo, substituindo a classe WebClient eu estava usando:

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}

Outras dicas

para os interessados:

System.Net.ServicePointManager.DefaultConnectionLimit = x (onde x é o número desejado de ligações)

Não há necessidade de referências extras

apenas certifique-se isso é chamado antes do ponto de serviço é criado como mencionado acima no post.

Esta solução permite alterar o limite de conexão no qualquer 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;
}

A primeira vez que alguém chama essa FindServicePoint , a instância ServicePoint é criado e um WeakReference é criado para segurá-lo dentro do ServicePointManager . Os pedidos subsequentes ao gerente para o mesmo Uri retornar a mesma instância. Se a conexão não for utilizado depois, o GC limpa-lo.

Se você encontrar o objeto ServicePoint sendo usado por seu WebClient, você pode mudar seu limite de conexão. HttpWebRequest objetos têm um acessador para recuperar o que eles foram construídos para uso, para que você possa fazê-lo dessa maneira. Se você tiver sorte, todos os seus pedidos pode acabar compartilhando o mesmo ServicePoint para que você só tem que fazer isso uma vez.

Eu não sei de nenhuma maneira global para alterar o limite. Se você alterou a DefaultConnectionLimit cedo o suficiente na execução, você provavelmente estaria bem.

Como alternativa, você poderia viver apenas com o limite de conexão, uma vez que a maioria dos softwares de servidor vai estrangular você de qualquer maneira. :)

Nós temos uma situação relativa a peça acima de configuração no App.Config

Para que isso seja válido em um aplicativo de console, que adicionado a dll referência System.Configuration. Sem a referência, o acima foi inútil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top