使用Microsoft.AspNetCore.HttpOverrides.IPNetwork的Contains方法结果不符合预期
问题原因
Microsoft.AspNetCore.HttpOverrides.IPNetwork的构造函数不会自动将传入的IP地址和前缀长度做掩码对齐,要求传入的第一个参数必须是对应子网的网络地址。
你传入的10.10.10.1不是/30子网的网络地址,/30对应的子网掩码是255.255.255.252,和10.10.10.1做按位与运算后得到的真正网络地址是10.10.10.0,所以你初始化的ipnw实例对应的子网范围本身就是错误的,才会出现所有Contains调用都返回false的问题。
解决方法
方法1:构造时直接传入对齐后的网络地址
把构造函数的第一个参数改为正确的网络地址即可:
void Main() { // 第一个参数传子网的网络地址 10.10.10.0 var ipnw = new Microsoft.AspNetCore.HttpOverrides.IPNetwork( IPAddress.Parse("10.10.10.0"), 30); // 以下4条返回true Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.0"))); Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.1"))); Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.2"))); Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.3"))); // 以下4条返回false Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.4"))); Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.5"))); Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.6"))); Console.WriteLine(ipnw.Contains(IPAddress.Parse("10.10.10.7"))); }
方法2:自动计算网络地址再初始化
如果你拿到的是子网内的任意IP,需要先手动做掩码对齐再构造IPNetwork实例:
public static IPAddress GetNetworkAddress(IPAddress ip, int prefixLength) { byte[] bytes = ip.GetAddressBytes(); int maskBits = prefixLength; for (int i = 0; i < bytes.Length; i++) { if (maskBits >= 8) { maskBits -= 8; continue; } if (maskBits == 0) { bytes[i] = 0; continue; } bytes[i] = (byte)(bytes[i] & (0xFF << (8 - maskBits))); maskBits = 0; } return new IPAddress(bytes); } // 调用示例 var ip = IPAddress.Parse("10.10.10.1"); var ipnw = new Microsoft.AspNetCore.HttpOverrides.IPNetwork(GetNetworkAddress(ip, 30), 30);
内容的提问来源于stack exchange,提问作者jmoreno
相关产品推荐
相关产品推荐

