. NET C# Служба, работающая за OpenVPN, не возвращает правильный publi c IP - PullRequest
0 голосов
/ 04 апреля 2020

Таким образом, цель этой службы состоит в том, чтобы определить, находится ли аппарат в известной сети, например, в разных офисах, или не основан на общедоступном c IP. Я создал несколько списков известных IP-адресов для сравнения. Если IP-адрес publi c неизвестен, я запускаю процесс для запуска соединения OpenVPN с моим сервером.

Я использовал http://ipv4.icanhazip.com для получения IP-адреса publi c.

Текущее поведение: в течение первого интервала таймера веб-запрос возвращает правильный опубликованный c IP. Затем VPN-соединение вызывается и вскоре устанавливается. В CMD я могу запустить curl http://ipv4.icanhazip.com и подтвердить IP-адрес VPN-сервера, а таблица маршрутизации IPv4 фактически обновлена. Весь трафик моего веб-браузера c маршрутизируется правильно.

Однако запросы на обслуживание никогда не возвращают новый IP-адрес в течение 15-секундных интервалов.

Вот моя функция WebRequest

 public static string ReturnPublicIP()
        {
            string url = "http://ipv4.icanhazip.com";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.AutomaticDecompression = DecompressionMethods.GZip;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd().Trim((char)0x0a, (char)0x0d);
            }
        }

Есть идеи, что я могу сделать, чтобы исправить это? Я предположил бы, что сетевой поток \ процесс будет знать об обновленной таблице маршрутов и отправлять трафик c соответственно ..

Заранее благодарен за любую помощь!

1 Ответ

0 голосов
/ 04 апреля 2020

Обратите внимание, что HttpWebRequest устарело. Вместо этого используйте HttpClient.

// HttpClient is intended to be instantiated once and re-used throughout the life of an application.
private static HttpClient client = new HttpClient();

public static async Task<string> ReturnPublicIP(string url)
{
    string result = await client.GetStringAsync(url);
    return result.Trim();
}

Затем позвоните

string ip = ReturnPublicIP("http://ipv4.icanhazip.com").GetAwaiter().GetResult();
...