digamos que temos um trecho de código
builder.Services.AddHttpClient("typicode", c =>
{
c.BaseAddress = new Uri("https://xxx");
c.DefaultRequestHeaders.Add(
"accept", "application/json");
})
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler()
{
PooledConnectionLifetime = TimeSpan.FromMinutes(5),
})
.SetHandlerLifetime(TimeSpan.FromMinutes(10));
Não entendi bem por que ele precisa chamar SetHandlerLifetime(TimeSpan.FromMinutes(10)
ou quais são os benefícios de chamá-lo. Sei que SetHandlerLifetime
controla por quanto tempo uma SocketsHttpHandler
instância (e seu pool de conexões) é reutilizada no "nível do manipulador" e PooledConnectionLifetime = TimeSpan.FromMinutes(5)
é para o "nível da conexão".
mas não é PooledConnectionLifetime = TimeSpan.FromMinutes(5)
suficiente usar isso, imagine que eu uso esse HttpClient para fazer várias solicitações para URLs diferentes, como foo1.com, foo2.com...foo10.com. Eu gostaria de um PooledConnectionIdleTimeout de 5 minutos no nível de conexão, então, por exemplo, a conexão para foo1.com expira após 5 minutos, mas foo2.com ainda está ativo e eu quero reutilizá-lo mais tarde, mas SetHandlerLifetime limpará todos os pools após 10 minutos?
Você não o utiliza, pois é essencialmente uma API redundante se você usá-lo
SocketHttpHandler
em cima comConfigurePrimaryHttpMessageHandler
/UseSocketsHttpHandler
.É por isso que a Microsoft desaconselha a configuração de ambas as opções de tempo de vida. Diretrizes de Uso de IHttpClientFactory com SocketsHttpHandler :
Além disso, no .NET 9 o HttpClientFactory usa SocketsHttpHandler como manipulador primário e a
HandlerLifetime
API é realmente usada para definirPooledConnectionLifetime
:No entanto, a rotação/reciclagem NÃO é desabilitada por padrão (conforme recomendado no trecho de documentação acima) por Make SocketsHttpHandler o manipulador primário padrão de HttpClientFactory #101808 :
Então, no .NET 9 (no momento), ambos os valores de tempo de vida correspondem por padrão e, na minha opinião, você obtém um pouco de funcionalidade duplicada. Mais discussão sobre como desabilitar a rotação/reciclagem por padrão em [informação ausente no original
SocketsHttpHandler
]IHttpClientFactory
. Considere atualizar os padrões do HttpClientFactory para aproveitar o SocketsHttpHandler #35987.PS. Um pouco de código de depuração que pode ser útil
Você já sabe disso, mas deixe-me reiterar:
SetHandlerLifetime é usado para controlar o tempo de vida dos manipuladores agrupados no
IHttpClientFactory
PooledConnectionLifetime é usado para controlar o tempo de vida das conexões agrupadas pelo manipulador
Um manipulador armazena cookies, certificados e um pool de conexões para os sites acessados por ele. Portanto, se um manipulador expirar e for descartado, todas as suas conexões também expirarão. O tempo de vida padrão de um manipulador é de 2 minutos, então não faz sentido defini-lo apenas
PooledConnectionLifetime
para 5 minutos.À medida que mais sites são visitados, a memória usada pelo manipulador também aumenta, talvez por isso haja um tempo de vida padrão para o manipulador. Portanto, se você não se importa com o crescimento da memória, pode definir o tempo de vida como
InfiniteTimeSpan
.