Привет, я пытаюсь написать программу, где я могу получить свой публичный 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
Ваш пользовательский интерфейс зависает, потому что вы загружаете строку с веб-сайта в потоке пользовательского интерфейса, что означает, что ваш поток пользовательского интерфейса может только ждать 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);
}
}
WebClient
, вызвав abc.DownloadStringTaskAsync(uri)
, но HttpClient
должен быть быстрее, потому что он не содержит вещи, связанные с имитацией веб-браузера, например WebClient
.Если вы используете.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);
}
}
http://www.ifconfig.me/ip
возвращает постоянную переадресацию на http://ifconfig.me/ip
, поэтому я думаю, что вы должны использовать адрес без www. Веб-сайт вызывает это. Его просто берут возраст, чтобы загрузить. Вы должны попробовать использовать другой веб-сайт: http://wtfismyip.com/text
Я пробовал
string myIP = new WebClient().DownloadString("http://wtfismyip.com/text");
и он работал нормально.
Альтернативный подход:
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);
Пробовал в 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/
Попробуйте загрузить асинхронную строку:
Uri uri = new Uri("http://ifconfig.me/ip");
XmlDocument xmlDocument = await XmlDocument.LoadFromUriAsync(uri);
string result = xmlDocument.ToString();