Dela via


HTTP: HttpClient-instanser som skapats av IHttpClientFactory-logg heltalsstatuskoder

HttpClient instanser som skapats av IHttpClientFactory HTTP-loggstatuskoder som heltal i stället för med statuskodnamn.

Version introducerad

5.0 Förhandsversion 1

Gammalt beteende

Loggning använder textbeskrivningar av HTTP-statuskoder. Överväg följande loggmeddelanden:

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

Nytt beteende

Loggning använder heltalsvärdena för HTTP-statuskoder. Överväg följande loggmeddelanden:

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

Orsak till ändringen

Det ursprungliga beteendet för den här loggningen är inkonsekvent med andra delar av ASP.NET Core som alltid har använt heltalsvärden. Inkonsekvensen gör loggarna svåra att köra frågor mot via strukturerade loggningssystem som Elasticsearch. Mer kontext finns i dotnet/extensions#1549.

Att använda heltalsvärden är mer flexibelt än text eftersom det tillåter frågor om intervall med värden.

Att lägga till ett annat loggvärde för att samla in heltalsstatuskoden övervägdes. Tyvärr skulle detta medföra en annan inkonsekvens med resten av ASP.NET Core. HttpClient-loggning och HTTP-server/värdloggning använder redan samma StatusCode nyckelnamn.

Det bästa alternativet är att uppdatera loggningsfrågor för att använda heltalsvärdena för statuskoder. Det här alternativet kan orsaka problem med att skriva frågor i flera ASP.NET Core-versioner. Det är dock mycket mer flexibelt att använda heltal för det här ändamålet för att köra frågor mot loggar.

Om du behöver framtvinga kompatibilitet med det gamla beteendet och använda textstatuskoder ersätter du loggningen IHttpClientFactory med din egen:

  1. Kopiera .NET Core 3.1-versionerna av följande klasser till projektet:

  2. Byt namn på klasserna för att undvika konflikter med offentliga typer i NuGet-paketet Microsoft.Extensions.Http .

  3. Ersätt den inbyggda implementeringen av LoggingHttpMessageHandlerBuilderFilter med din egen i projektets Startup.ConfigureServices metod. Till exempel:

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

Berörda API:er

System.Net.Http.HttpClient