ASP0028:考虑使用 IPAddress.IPv6Any 而不是 IPAddress.Any

规则 ID ASP0028
类别 使用情况
修复是中断修复还是非中断修复 非中断

原因

在支持 IPv6的服务器计算机上, IPv6Any 优先于 Any ,因为 Any 可能比 IPv6Any。 在某些情况下, Any 可能根本不起作用。 Any由于基础系统类型实现速度可能会变慢。

127.0.0.1 是 IPv4 环回地址。 ::1 是 IPv6 环回地址。 Any 是 IPv4 的通配符地址。 IPv6Any 是 IPv6 的通配符地址。

使用 HTTP/1.x 或 HTTP/2.0 时,IPv6 的当前行为:

  • 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可以通过 AppCtx 开关或环境变量禁用系统范围或 .NET