在Linux上,非特殊許可權進程無法傳送原始IP封包。 透過與 Ping 公用程式互動來實作 ping
功能。 不過,此公用程式不支援指定因特網控制訊息通訊協定 (ICMP) Ping 封包的自定義承載。 .NET 7 新增了對這類情況的檢查,並在指定自定義承載時擲回例外狀況。
先前的行為
在舊版中,非特殊許可權 Linux 進程上會以無訊息方式忽略 Ping 封包承載(也就是未傳送)。
新行為
從 .NET 7 開始,如果您嘗試在非特權的 Linux 進程中傳送自定義的 Ping 封包負載,則會拋出 PlatformNotSupportedException。
推出的版本
.NET 7
破壞性變更的類型
這項變更可能會影響 二進位相容性。
變更的原因
最好向使用者發出訊號,指出無法執行作業,而不是以無訊息方式卸除承載。
建議的動作
如果需要傳送 ping 負載,請以 root
的身份執行應用程式,或使用 cap_net_raw
工具授予 setcap
功能。
否則,請使用 不接受自定義承載的 多載 Ping.SendPingAsync ,或傳入空陣列。
受影響的 API
- System.Net.NetworkInformation.Ping.Send(IPAddress, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.Send(IPAddress, Int32, Byte[])
- System.Net.NetworkInformation.Ping.Send(String, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.Send(String, Int32, Byte[])
- System.Net.NetworkInformation.Ping.SendAsync(IPAddress, Int32, Byte[], PingOptions, Object)
- System.Net.NetworkInformation.Ping.SendAsync(IPAddress, Int32, Byte[], Object)
- System.Net.NetworkInformation.Ping.SendAsync(String, Int32, Byte[], PingOptions, Object)
- System.Net.NetworkInformation.Ping.SendAsync(String, Int32, Byte[], Object)
- System.Net.NetworkInformation.Ping.SendPingAsync(IPAddress, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.SendPingAsync(IPAddress, Int32, Byte[])
- System.Net.NetworkInformation.Ping.SendPingAsync(String, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.SendPingAsync(String, Int32, Byte[])