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


ASP0028. Рассмотрите возможность использования IPAddress.IPv6Any вместо IPAddress.Any

Значение
Идентификатор правила ASP0028
Категория Использование
Исправление является нарушающим или не нарушающим Безразрывный

Причина

На серверном компьютере, поддерживающем IPv6, IPv6Any предпочтительнее Any, так как Any может работать медленнее, чем IPv6Any. В некоторых случаях Any может не работать вообще. Anyможет быть медленнее из-за реализации базовых системных типов.

127.0.0.1 — это адрес обратного цикла IPv4. ::1 — это адрес обратного цикла IPv6. Any — это подстановочный адрес для IPv4. IPv6Any — это подстановочный адрес для IPv6.

Текущее поведение с IPv6 при использовании HTTP/1.x или HTTP/2.0:

  • localhost разрешается как [::1].
  • [::1] не принимается сервером, который вынуждает повторить попытку с помощью 127.0.0.1, создавая замкнутый цикл.

Использование Any с предыдущими условиями приводит к возникновению диагностического ASP0028 сообщения. Ниже приведен пример кода, который может привести к следующим условиям:

.UseKestrel().ConfigureKestrel(options =>
{ 
    options.Listen(IPAddress.Any, ...);
})

Описание правила

Рекомендуемый способ настроить Kestrel прослушивание входящих подключений во всех доступных IPv6 сетевых интерфейсах IPv6Any.

Устранение нарушений

Для проблемного кода замените AnyIPv6Anyна .

ListenAnyIP(Int32) Используйте метод без указания аргументов:

.UseKestrel().ConfigureKestrel(options =>
{ 
-   options.Listen(IPAddress.Any, ...);
+   options.ListenAnyIP(...);
})

Или используйте IPv6Any поле:

.UseKestrel().ConfigureKestrel(options =>
{ 
-   options.Listen(IPAddress.Any, ...);
+   options.Listen(IPAddress.IPv6Any, ...);
})

Когда лучше отключить предупреждения

Диагностика ASP0028 имеет уровень серьезности сведений . Отключите это предупреждение, если вы намерены полностью отключить IPv6 использование на сервере, хотя это рискует проблемами производительности, упомянутыми в этой статье.

IPv6 может быть отключён как на уровне всей системы, так и только для .NET с помощью переключателя AppCtx или переменной среды.