Поделиться через


HTTP: экземпляры HttpClient, созданные кодами состояния целочисленного числа журнала IHttpClientFactory

Экземпляры HttpClient, создаваемые IHttpClientFactory, регистрируют коды состояния HTTP как целые числа вместо имен кодов состояния.

Представленные версии

5.0 Предварительная версия 1

Старое поведение

Ведение журнала использует текстовые описания кодов состояния HTTP. Рассмотрим следующее сообщение журнала:

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

Новое поведение

Ведение журнала использует целочисленные значения кодов состояния HTTP. Рассмотрим следующее сообщение журнала:

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

Причина изменения

Исходная настройка такого ведения журнала не согласуется с другими частями ASP.NET Core, которые всегда использовали целые значения. Несогласованность усложняет запросы к журналам с помощью структурированных систем ведения журналов, таких как Elasticsearch. Дополнительный контекст см. в dotnet/extensions#1549.

Целочисленные значения дают больше гибкости по сравнению с текстом, так как позволяют выполнять запросы к диапазонам значений.

Рассматривалось добавление еще одного значения журнала для записи целочисленного кода состояния. К сожалению, это могло привести к несогласованности с остальной частью ASP.NET Core. При ведении журнала HttpClient и сервера/хостинга HTTP уже используется одно и то же имя ключа StatusCode.

Лучшим вариантом является обновление запросов журнала для использования целочисленных значений кодов состояния. Этот вариант может вызвать некоторые трудности при записи запросов в нескольких версиях ASP.NET Core. Однако использование целых чисел для этой цели предоставляет больше возможностей для запросов журналов.

Если необходимо обеспечить совместимость со старым поведением и использовать текстовые коды состояния, замените IHttpClientFactory собственными:

  1. Скопируйте в проект версии .NET Core 3.1 следующих классов:

  2. Переименуйте классы, чтобы избежать конфликтов с открытыми типами в пакете NuGet Microsoft.Extensions.Http.

  3. Замените встроенную реализацию LoggingHttpMessageHandlerBuilderFilter собственной в методе Startup.ConfigureServices проекта. Например:

    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

System.Net.Http.HttpClient