Значение моего RequestMapping
заканчивается на .html, который должен быть чем-то другим.
Я попытался изменить его на .json, и он сработал для меня.
добавьте что-то подобное в ваш код
if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
// IPv4 address
Написать locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
Из моего блога :
/// <summary>
/// This utility function displays all the IP (v4, not v6) addresses of the local computer.
/// </summary>
public static void DisplayIPAddresses()
{
StringBuilder sb = new StringBuilder();
// Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface network in networkInterfaces)
{
// Read the IP configuration for each network
IPInterfaceProperties properties = network.GetIPProperties();
// Each network interface may have multiple IP addresses
foreach (IPAddressInformation address in properties.UnicastAddresses)
{
// We're only interested in IPv4 addresses for now
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
continue;
// Ignore loopback addresses (e.g., 127.0.0.1)
if (IPAddress.IsLoopback(address.Address))
continue;
sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")");
}
}
MessageBox.Show(sb.ToString());
}
В частности, я не рекомендую Dns.GetHostAddresses(Dns.GetHostName());
, независимо от того, насколько популярна эта строка в различных статьях и блог.
Вот функция, которую я использую:
public static string GetIP4Address()
{
string IP4Address = String.Empty;
foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (IPA.AddressFamily == AddressFamily.InterNetwork)
{
IP4Address = IPA.ToString();
break;
}
}
return IP4Address;
}
В качестве перечислимого:
public static IEnumerable<string> GetIP4Addresses()
{
return Dns.GetHostAddresses(Dns.GetHostName())
.Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
.Select(x => x.ToString());
}
Очень чистый и сладкий при использовании Linq
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
Вот код для поиска первого подключенного IPv4 с помощью цикла for:
IPAddress ipAddress = null;
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
for (int i=0 ; i<localIPs.Length ; i++)
{
if (localIPs[i].AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = localIPs[i];
break;
}
}
Я использую этот вспомогательный метод, который возвращает первый активный адрес IPV4 после фильтрации IPV6 и Loopback один раз
public static IPAddress GetLocalIPAddress()
{
IPAddress result = null;
IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
IPAddress[] ipv4Address = Array.FindAll(iphostentry.AddressList, add => add.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(add));
if (ipv4Address.Length > 0 )
{
result =ipv4Address[0];
}
return result;
}
Из MSDN на Dns.GetHostAddresses ,
Когда в качестве имени хоста передается пустая строка, этот метод возвращает адреса IPv4 локального хоста для всех операционных систем. кроме Windows Server 2003; для Windows Server 2003 возвращаются адреса IPv4 и IPv6 для локального хоста.
Адреса IPv6 фильтруются по результатам метода GetHostAddresses, если на локальном компьютере не установлен IPv6. В результате, можно получить пустой экземпляр IPAddress, если только результаты IPv6 доступны там, где они доступны для параметра hostNameOrAddress.parameter.
Итак, вы можете использовать это, чтобы попытаться разобрать его :
IPAddress.TryParse
, а затем проверить AddressFamily
, который
возвращает систему .Net.Sockets.AddressFamily.InterNetwork для IPv4 или System.Net.Sockets.AddressFamily.InterNetworkV6 для IPv6.
string input = "192.168.0.10";
IPAddress address;
if (IPAddress.TryParse(input, out address))
{
switch (address.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
// we have IPv4
break;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
// we have IPv6
break;
default:
// do something else
break;
}
}
Я использовал ответ, который начинался с
/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
Я должен был использовать:
if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
, но я фактически использовал:
if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))
Также Добавлено:
if (network.OperationalStatus != OperationalStatus.Up)
continue;
Поскольку были некоторые сети, которые не работали и никогда не должны были там, я видел, что они были в реестре. --- Элвин
Для меня более чистым решением было бы:
public static string GetLocalIP()
{
string ipv4Address = String.Empty;
foreach (IPAddress currentIPAddress in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (currentIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
ipv4Address = currentIPAddress.ToString();
break;
}
}
return ipv4Address;
}
Это мой код. И может найти его на многих сетевых картах.
private string GetLocalIpAddress()
{
string localIpAddress = string.Empty;
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface nic in nics)
{
if (nic.OperationalStatus != OperationalStatus.Up)
{
continue;
}
IPv4InterfaceStatistics adapterStat = (nic).GetIPv4Statistics();
UnicastIPAddressInformationCollection uniCast = (nic).GetIPProperties().UnicastAddresses;
if (uniCast != null)
{
foreach (UnicastIPAddressInformation uni in uniCast)
{
if (adapterStat.UnicastPacketsReceived > 0
&& adapterStat.UnicastPacketsSent > 0
&& nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
{
if (uni.Address.AddressFamily == AddressFamily.InterNetwork)
{
localIpAddress = nic.GetIPProperties().UnicastAddresses[0].Address.ToString();
break;
}
}
}
}
}
return localIpAddress;
}