Partilhar via


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

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

Versão introduzida

5.0 Prévia 1

Comportamento antigo

O registo de atividades 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

O registo usa 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 mudança

O comportamento original desse 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.

Foi considerada a adição de outro valor de log para capturar o código de status inteiro. Infelizmente, fazê-lo introduziria outra incoerência com o resto do ASP.NET Core. O registo do HttpClient e o registo do servidor/hospedagem HTTP já usam o mesmo nome de chave StatusCode.

A melhor opção é atualizar as consultas de log para usar os valores inteiros dos códigos de status. Essa opção pode causar alguma dificuldade para escrever 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 IHttpClientFactory registro por seu próprio:

  1. Copie as versões do .NET Core 3.1 das seguintes classes para o 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 pela sua no método projeto Startup.ConfigureServices. 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