Atrodução do serviço WCF
-
20-09-2019 - |
Pergunta
Eu tenho um serviço WCF implantado em um aplicativo de console com BasichttpBinding e SSL ativado. O atributo a seguir também é definido:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
Eu também defini o comportamento de aceleração para
<serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentSessions="2147483647"
maxConcurrentInstances="2147483647" />
Por outro lado, criei um cliente de teste (para teste de carga) que inicia vários clientes simultaneamente (vários threads) e executa transações no servidor. Tudo parece bom, mas no servidor a utilização da CPU não aumenta, então adicionei alguns logs para visualizar o número de chamadas simultâneas para o servidor e descobri que ele nunca ultrapassou 6.
Eu revisei o código de registro do contador de desempenho mais que duas vezes e parece bom para mim.
Então, eu quero perguntar onde está o problema nessa situação? Ainda não especifiquei nenhum tipo de contextmode ou concurrencymode.
Após este post, notei que sempre que inicio outra íntima do cliente de teste, meu servidor simultâneo chama o contador de contador para 2, como se eu estiver executando apenas 1 instância, as chamadas máximas de RCVD simultâneas serão 2 e, se houver duas instâncias, o mesmo valor for para 4 e assim por diante. Existe algum limite de número de chamadas do WCF de um processo de uma vez?
******** adicionado em 17 de março ********
Hoje, executei outro teste com um cliente de teste (com 50 usuários simultâneos) na mesma máquina em que o servidor está em execução. Desta vez, estou obtendo o resultado exato o que eu queria mostrar (ou seja, chamadas simultâneas máximas RCVD por servidor = 50).
Mas eu preciso fazer o mesmo em outras máquinas. Alguém pode me ajudar nisso?
Solução 2
Encontrei uma solução: existe um limite de conexão no ServicePointManager que estava causando esse problema. Para remover esse limite, você só precisa definir
System.Net.ServicePointManager.DefaultConnectionLimit = X;
onde o limite padrão é 2.
Outras dicas
Ou use essa configuração no cliente.
<system.net>
<connectionManagement>
<add maxconnection = "200" address ="*" />
</connectionManagement>
</system.net>
Aqui 200 é o limite do cliente