Condividi tramite


HTTP: Istanze di HttpClient create da codici di stato integer del log IHttpClientFactory

HttpClient istanze create dai IHttpClientFactory codici di stato HTTP del log come numeri interi anziché con nomi di codice di stato.

Versione introdotta

5.0 Preview 1

Comportamento precedente

La registrazione usa le descrizioni testuali dei codici di stato HTTP. Considerare i messaggi dei log seguenti:

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

Nuovo comportamento

La registrazione usa i valori interi dei codici di stato HTTP. Considerare i messaggi dei log seguenti:

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

Motivo della modifica

Il comportamento originale di questa registrazione è incoerente con altre parti di ASP.NET Core che hanno sempre usato valori interi. L'incoerenza rende i log difficili da eseguire tramite sistemi di registrazione strutturati, come Elasticsearch. Per altre informazioni di contesto, vedere dotnet/extensions#1549.

L'uso di valori interi è più flessibile rispetto al testo perché consente query su intervalli di valori.

È stato presa in considerazione l'aggiunta di un altro valore di log per acquisire il codice di stato intero. Purtroppo, questa operazione introdurrebbe un'altra incoerenza con il resto di ASP.NET Core. La registrazione HttpClient e la registrazione HTTP/server/hosting usano già lo stesso nome StatusCode di chiave.

L'opzione migliore consiste nell'aggiornare le query di registrazione per usare i valori interi dei codici di stato. Tale opzione può causare alcune difficoltà a scrivere query in più versioni di ASP.NET Core. Tuttavia, l'uso di numeri interi a questo scopo è molto più flessibile per l'esecuzione di query sui log.

Se è necessario forzare la compatibilità con il comportamento precedente e usare i codici di stato testuali, sostituire la registrazione IHttpClientFactory con quella propria:

  1. Copiare le versioni di .NET Core 3.1 delle classi seguenti nel progetto:

  2. Rinominare le classi per evitare conflitti con i tipi pubblici nel pacchetto NuGet Microsoft.Extensions.Http.

  3. Sostituire l'implementazione predefinita di LoggingHttpMessageHandlerBuilderFilter con la propria nel metodo del progetto Startup.ConfigureServices. Ad esempio:

    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>();
    }
    

API interessate

System.Net.Http.HttpClient