Compartilhar via


HTTP: As instâncias HttpClient criadas por IHttpClientFactory registram códigos de status inteiros

HttpClient instâncias criadas por IHttpClientFactory registram códigos de status HTTP como inteiros em vez de usarem nomes de código de status.

Versão introduzida

5.0 Versão Prévia 1

Comportamento antigo

O registro em log usa as descrições textuais dos códigos de status HTTP. Considere as seguintes mensagens de log:

Received HTTP response after 56.0044ms - OK
End processing HTTP request after 70.0862ms - OK

Novo comportamento

A geração de logs utiliza os valores inteiros dos códigos de status HTTP. Considere as seguintes mensagens de log:

Received HTTP response after 56.0044ms - 200
End processing HTTP request after 70.0862ms - 200

Motivo da alteração

O comportamento original desse registro em log é inconsistente com outras partes do ASP.NET Core que sempre usaram valores inteiros. A inconsistência dificulta a consulta de logs por meio de sistemas de log estruturados, como o Elasticsearch. Para obter mais contexto, consulte dotnet/extensions#1549.

O uso de valores inteiros é mais flexível do que o texto porque permite consultas em intervalos de valores.

A adição de outro valor de log para capturar o código de status inteiro foi considerada. Infelizmente, isso introduziria outra inconsistência com o resto do ASP.NET Core. O registro em log do HttpClient e o registro em log do servidor/hospedagem HTTP já usam o mesmo nome de chave StatusCode.

A melhor opção é atualizar consultas de log para usar os valores inteiros dos códigos de status. Essa opção pode causar alguma dificuldade para gravar consultas em várias versões do ASP.NET Core. No entanto, o uso de inteiros para essa finalidade é muito mais flexível para consultar logs.

Se você precisar forçar a compatibilidade com o comportamento antigo e usar códigos de status textuais, substitua o registro em log IHttpClientFactory pelo seu próprio:

  1. Copie as versões do .NET Core 3.1 das seguintes classes em seu projeto:

  2. Renomeie as classes para evitar conflitos com tipos públicos no pacote NuGet Microsoft.Extensions.Http .

  3. Substitua a implementação interna de LoggingHttpMessageHandlerBuilderFilter com sua própria no método Startup.ConfigureServices do projeto. Por exemplo:

    public void ConfigureServices(IServiceCollection services)
    {
        // Other service registrations go first. Code omitted for brevity.
    
        // Place the following after all AddHttpClient registrations.
        services.RemoveAll<IHttpMessageHandlerBuilderFilter>();
    
        services.AddSingleton<IHttpMessageHandlerBuilderFilter,
                              MyLoggingHttpMessageHandlerBuilderFilter>();
    }
    

APIs afetadas

System.Net.Http.HttpClient