Получить локальный IP-адрес интерфейса, используемого для вызова веб-службы в службе Windows - PullRequest
3 голосов
/ 25 января 2012

Мы разрабатываем службу Windows для установки на клиентские системы.Это приложение периодически выполняет вызовы веб-службы SOAP на нашем сервере.Мы хотим включить локальный IP-адрес клиентской системы в запросы SOAP каждый раз, когда они обращаются к нашему сервису в целях устранения неполадок.Просматривая другие посты здесь, я нашел следующий код для получения списка IP-адресов для интерфейсов в системе:

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());

Этот код включен в службу Windows.Есть ли простой способ определить, какой IP-адрес в этом массиве назначен интерфейсу, через который маршрутизируется вызов веб-службы?

Ответы [ 3 ]

1 голос
/ 25 января 2012

Если вы используете WCF 3.5 или более позднюю версию, вы можете получить IP-адрес клиента в службе напрямую, используя свойства сообщения, как показано в коде этого блога

0 голосов
/ 25 января 2012

Возвращает список, содержащий IP-адреса на машине, на которой он работает, пока работает адаптер, а не интерфейс обратной связи.

public static List<string> DisplayDnsAddresses()
{
    var addresses = NetworkInterface.GetAllNetworkInterfaces()
        .Where(a => a.OperationalStatus == OperationalStatus.Up
                    && a.NetworkInterfaceType != NetworkInterfaceType.Loopback)
        .Select(a => a.GetIPProperties())
        .SelectMany(ipp => ipp.UnicastAddresses
            .Select(x => x.Address.ToString()));

    return addresses.ToList();
}

Вероятно, это нужно немного улучшить.Я не уверен, как быть уверенным в том, какой интерфейс будет использовать веб-служба, но если бы вы знали шлюз, который необходимо использовать для доступа к вашей сети, возможно, вы могли бы определить его.

0 голосов
/ 25 января 2012

Вы можете запустить следующий код в своей службе Windows, чтобы получить IP для любого интерфейса на коробке.

/// <summary>
/// Returns the IP Address of the given interface
/// </summary>
/// <param name="InterfaceName">Name of the interface</param>
/// <param name="AddressFamily">Address family to search for</param>
/// <returns>IPAddress of assinged IP address</returns>
public IPAddress GetIPAddress(string InterfaceName, System.Net.Sockets.AddressFamily AddressFamily)
{
    System.Net.NetworkInformation.NetworkInterface Interface = GetInterface(InterfaceName);
    if (Interface != null)
    {
        foreach (System.Net.NetworkInformation.UnicastIPAddressInformation IP in Interface.GetIPProperties().UnicastAddresses) 
        {
            //Match address family
            if(IP.Address.AddressFamily != AddressFamily)
                continue;

            //Check for IPv6 conditions since we can easily have multiple IPs
            if(IP.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6 && (IP.Address.IsIPv6LinkLocal || IP.AddressPreferredLifetime != uint.MaxValue || IP.AddressValidLifetime != uint.MaxValue))
                continue;

            //We've found the IP
            return IP.Address;
        }
    }

    return null;
}

/// <summary>
/// Returns the Network Interface for the given windows name
/// </summary>
/// <param name="InterfaceName">Interface name to get (ie Local Area Connection)</param>
/// <returns>Network Interface, or null if not found</returns>
System.Net.NetworkInformation.NetworkInterface GetInterface(string InterfaceName)
{
    if (InterfaceName == null || InterfaceName.Length == 0)
        return null;

    foreach (System.Net.NetworkInformation.NetworkInterface Interface in NetworkInterfaceArray)
    {
        if (Interface.Name == InterfaceName)
            return Interface;
    }

    return null;
}
...