Mejor uso de HttpClient en el módulo binario de PowerShell

Estoy actualizando algunos scripts que usan comandos de PowerShell como Invoke-WebRequest y Convert-FromJson a un módulo binario usando HttpClient y System.Text.Json

Todo está bien, tengo un módulo mucho más rápido y una biblioteca compartida que puedo usar en otros proyectos .net.

Mi servicio de acceso a datos depende de un HttpClient, en el comando esto se instancia en el método beginProccess del comando/clase. Esto al menos reutilizará el cliente para múltiples entradas de canalización.

Mi pregunta es, ¿se puede volver a utilizar el cliente? ¿Entonces me arriesgaría a tener problemas de subprocesos múltiples? ¿Puede pertenecer al módulo y, aún mejor, podría el módulo poseer una HttpClientFactory?

Answer

Pensé que una buena respuesta a esto sería un análisis de la fuente Invoke-WebRequest .

Esta clase abstracta hereda, PSCmdletque es un requisito previo para un cmdlet de PowerShell. Tiene un método de fábrica que instancia y devuelve una HttpClientllamada GetHttpClientcon la configuración deseada.

Este método se usa en el GetResponsemétodo para crear un nuevo cliente en caso de error, pero generalmente usa un HttpClientparámetro dado. En caso de error, el nuevo cliente se elimina inmediatamente después de obtener un correo electrónico a HttpRequestMessagetravés de la usingsintaxis.

ProcessRecordtambién crea y dispone de un cliente para su uso con el GetResponsemétodo.

Este estudio de caso sugiere que en un cmdlet de PowerShell, el correo electrónico HttpClientdebe tener una duración muy breve y no compartirse entre invocaciones del cmdlet o incluso para diferentes entradas de canalización del cmdlet.