Como posso programaticamente remover o limite de 2 de conexão em WebClient
-
21-08-2019 - |
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 ??p>
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.