ASP0028:請考慮使用
| 價值 | |
|---|---|
| 規則識別碼 | 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。
如何修正違規
針對有問題的程式代碼,將 取代 Any 為 IPv6Any。
使用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參數或環境變數 停用。