从网站获取字符串

时间:2014-05-22 18:37:59

标签: c#

您好我正在尝试编写一个程序,我可以从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

5 个答案:

答案 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)

  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);
        }
    }
    
  2. 请注意,您可以通过调用WebClientabc.DownloadStringTaskAsync(uri)执行相同的操作,但HttpClient应该更快,因为它不包含与{{1}等网络浏览器模拟相关的内容}}。
  3. 另请注意,对于这两个API,您应该通过将客户端包装在using语句中来处置它,因为它必须释放一些资源,例如关闭为传入数据打开的流。
  4. 如果您使用的.NET Framework版本低于4.5且想要使用WebClient - 请尝试使用此代码段,它不应该冻结您的UI:

    WebClient
  5. 我注意到有时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();