共用方式為


ASP0028:請考慮使用 IPAddress.IPv6Any 而非 IPAddress.Any

價值
規則識別碼 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

如何修正違規

針對有問題的程式代碼,將 取代 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參數或環境變數 停用。