Получение строки с сайта

1

Привет, я пытаюсь написать программу, где я могу получить свой публичный IP-адрес от http://ifconfig.me/ip

но мой код не работает. Программа компилируется, но когда я нажимаю кнопку, чтобы получить ip и отображать ее на txtbox, программа заморожена. Я пробовал следующий код

using system.xml;
XmlDocument document = new XmlDocument();
document.Load("http://ifconfig.me/ip");
string allText = document.InnerText;

и мой другой код

using system.net
WebClient abc = new WebClient();
txtMyIp.Text = abc.DownloadString("http://www.ifconfig.me/ip");

может ли кто-нибудь сказать мне, почему программа зависает, когда я нажимаю кнопку? или предложить мне другой способ/метод?

btw Я использую visual studio 2012

Теги:

5 ответов

1
Лучший ответ
  1. Ваш пользовательский интерфейс зависает, потому что вы загружаете строку с веб-сайта в потоке пользовательского интерфейса, что означает, что ваш поток пользовательского интерфейса может только ждать unitl вашего abc.DownloadString("http://www.ifconfig.me/ip"); выполняет. Вместо этого я бы рекомендовал вам использовать async/HttpClient и HttpClient из System.Net.Http. Ваш код будет выглядеть так:

    private async void button1_Click(object sender, EventArgs e)
    {
        using (var abc = new HttpClient())
        {
           var uri = new Uri(@"http://www.ifconfig.me/ip");
           txtMyIp.Text = await abc.GetStringAsync(uri);
        }
    }
    
  2. Обратите внимание, что вы можете сделать то же самое с WebClient, вызвав abc.DownloadStringTaskAsync(uri), но HttpClient должен быть быстрее, потому что он не содержит вещи, связанные с имитацией веб-браузера, например WebClient.
  3. Также обратите внимание, что при использовании обоих API вы должны распоряжаться своим клиентом, обернув его в оператор using, поскольку он должен освободить некоторые ресурсы, например закрыть поток, открытый для входящих данных.
  4. Если вы используете.NET Framework версии менее 4,5 и хотите использовать WebClient - попробуйте этот фрагмент кода, он не должен замораживать ваш пользовательский интерфейс:

    private void button1_Click(object sender, EventArgs e)
    {
        using (var abc = new WebClient())
        {
            var uri = new Uri(@"http://www.ifconfig.me/ip");
            abc.DownloadStringCompleted += (o, args) => txtMyIp.Text = args.Result;
            abc.DownloadStringAsync(uri);
        }
    }
    
  5. Я заметил, что иногда http://www.ifconfig.me/ip возвращает постоянную переадресацию на http://ifconfig.me/ip, поэтому я думаю, что вы должны использовать адрес без www.
3

Веб-сайт вызывает это. Его просто берут возраст, чтобы загрузить. Вы должны попробовать использовать другой веб-сайт: http://wtfismyip.com/text Я пробовал

string myIP = new WebClient().DownloadString("http://wtfismyip.com/text");

и он работал нормально.

  • 0
    Попробуйте WhatsMyIp . Это намного быстрее, чем тот, с которого вы пытаетесь скрести экран.
1

Альтернативный подход:

using System.IO;
using System.Net;

String url = "http://ifconfig.me/ip";
String responseFromServer = null;
try
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    if (response.StatusCode == HttpStatusCode.OK)
    {
        using (Stream dataStream = response.GetResponseStream())
        {
            using (StreamReader reader = new StreamReader(dataStream))
                responseFromServer = reader.ReadToEnd();
        }
    }
}
catch { }

if (!String.IsNullOrEmpty(responseFromServer))
    MessageBox.Show(responseFromServer);
1

Пробовал в LINQPad с успехом (не забудьте добавить пространство имен System.Net):

void Main()
{
    var  client = new WebClient();
    Console.WriteLine(client.DownloadString("http://www.ifconfig.me/ip"));
}

Результат:

177.156.151.233

PS: Linqpad: https://www.linqpad.net/

0

Попробуйте загрузить асинхронную строку:

Uri uri = new Uri("http://ifconfig.me/ip");
XmlDocument xmlDocument = await XmlDocument.LoadFromUriAsync(uri);
string result = xmlDocument.ToString();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню