您好我正在尝试编写一个程序,我可以从http://ifconfig.me/ip获取公共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
答案 0 :(得分:3)
是导致这样做的网站。它只需要很长时间才能加载。
您应该尝试使用其他网站:http://wtfismyip.com/text
我试过了
string myIP = new WebClient().DownloadString("http://wtfismyip.com/text");
它工作正常。
答案 1 :(得分: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);
答案 2 :(得分: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/
答案 3 :(得分:1)
您的UI冻结是因为您在UI线程中从网站下载字符串,这意味着您的UI线程只能等待您abc.DownloadString("http://www.ifconfig.me/ip");
执行的单元。
不过,我建议你使用as {/ 1}和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
应该更快,因为它不包含与{{1}等网络浏览器模拟相关的内容}}。如果您使用的.NET Framework版本低于4.5且想要使用WebClient - 请尝试使用此代码段,它不应该冻结您的UI:
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
,因此我认为您应该使用不带www的地址。答案 4 :(得分:0)
您应该尝试异步下载字符串:
Uri uri = new Uri("http://ifconfig.me/ip");
XmlDocument xmlDocument = await XmlDocument.LoadFromUriAsync(uri);
string result = xmlDocument.ToString();