Essas RFCs "finas" exigem de todos os clientes RFC que tomem cuidado para não usar mais de 2 conexões por host ...
A Microsoft implementou isso no WebClient. Eu sei que 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 em http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )
Mas como posso fazer isso programaticamente?
Acordo para http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"Alterar a propriedade DefaultConnectionLimit não tem efeito nos objetos ServicePoint existentes; afeta apenas objetos ServicePoint que são inicializados após a alteração. Se o valor desta propriedade não foi definido diretamente ou por meio da configuração, o valor padrão é a constante DefaultPersistentConnectionLimit."
Eu gostaria melhor de configurar o limite quando eu instanciar o WebClient, mas apenas remover essa limitação triste programaticamente no início do meu programa também estaria bom.
O servidor que eu acesso não é um servidor normal da internet, mas está sob meu controle e na lan local. Quero fazer chamadas API, mas não uso webservices ou remoting
Respostas:
Com algumas dicas daqui e de outros lugares, consegui corrigir isso em meu aplicativo, substituindo a classe WebClient que estava usando:
fonte
System.Net.ServicePointManager.DefaultConnectionLimit
é a melhor solução, pois não se pode assumir queWebRequest
é aHttpWebRequest
, por exemplo, poderia ser aFileRequest
.para os interessados:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(onde x é o número desejado de conexões)sem necessidade de referências extras
apenas certifique-se de que isso seja chamado ANTES de o ponto de serviço ser criado conforme mencionado acima na postagem.
fonte
Esta solução permite que você altere o limite de conexão a qualquer momento :
Na primeira vez que alguém chama este FindServicePoint , uma instância do ServicePoint é criada e um WeakReference é criado para mantê-lo dentro do ServicePointManager . As solicitações subsequentes ao gerente para o mesmo Uri retornam a mesma instância. Se a conexão não for usada depois, o GC a limpará.
fonte
ServicePoint
é perdido (junto com suas configurações) apósMaxIdleTime
Se você encontrar o objeto ServicePoint sendo usado por seu WebClient, poderá alterar seu limite de conexão. Os objetos HttpWebRequest têm um acessador para recuperar aquele para o qual foram construídos para usar, portanto, você pode fazer isso dessa maneira. Se você tiver sorte, todas as suas solicitações podem acabar compartilhando o mesmo ServicePoint, então você só terá que fazer isso uma vez.
Não conheço nenhuma forma global de alterar o limite. Se você alterou DefaultConnectionLimit no início da execução, provavelmente não terá problemas.
Como alternativa, você pode simplesmente viver com o limite de conexão, uma vez que a maioria dos softwares de servidor vai restringi-lo de qualquer maneira. :)
fonte
Temos uma situação em relação à peça de configuração acima em App.Config
Para que isso seja válido em um aplicativo CONSOLE, adicionamos a dll de referência System.Configuration. Sem a referência, o anterior era inútil.
fonte