none
关于Windows Phone开发中使用WebClient获取网页源码的问题 RRS feed

  • 问题

  •         public static string GetHTML(string url)
            {
                Uri u = new Uri(url);
                string strHTML = string.Empty;
                wc.OpenReadAsync(u);
                wc.OpenReadCompleted+=new OpenReadCompletedEventHandler((object obj,OpenReadCompletedEventArgs e)=>{
                    StreamReader sr = new StreamReader (e.Result);
                    strHTML = sr.ReadToEnd();
                    sr.Close();
                    e.Result.Close();
                });
                while (true)
                    if (strHTML != String.Empty)
                        return strHTML;
            }

    如上是我的代码,作用是获取包含url源码的字符串 本代码在WinForm中测试成功,于是我把拿到了WP程序中。

    但是测试的时候始终不能触发完成事件,strHTML始终为空,于是方法不能完成(已确认URL有效)

    这是怎么回事(WP8模拟器已联网),或者是否有其他方法?(DownloadStringAsync方法同样不能用)

    2012年11月11日 8:08

全部回复

  • 你好,

    从MSDN的Help上来看,

    You cannot call the OpenReadAsync method again on the same WebClient object, until the first download operation is completed. Doing this causes an exception.

    是否把WebClient webClient = new WebClient()放在同一个函数中为好。

    如:

    private void DoWebClient()
    {
    WebClient webClient
    = new WebClient();
    webClient.OpenReadAsync(
    new Uri("http://www.cnblogs.com/linzheng"));//在不阻止调用线程的情况下,从资源返回数据
    webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);//异步操作完成时发生
    }
    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
    using (StreamReader reader = new StreamReader(e.Result))
    {
    string contents = reader.ReadToEnd();
    int begin = contents.ToString().IndexOf("<title>");
    int end = contents.ToString().IndexOf("</title>");
    string note = contents.Substring(contents.ToString().IndexOf("摘要"), 300);
    webClientTextBlock.Text
    = contents.ToString().Substring(begin+7, end - begin-7);
    textBox1.Text
    = note;
    }

    }


    Keep Fighting

    2012年11月12日 5:29
  • 谢谢你的回答

    我的代码中的wc是我已经在这个静态类中初始化了的一个WebClient字段,跟再实例化一个WebClient应该没有什么区别吧

    而且我这个函数的作用就是获取网页返回值,如果不需要返回值的话,我根本不需要用while语句等待。

    你的方法的实质就是把我的lambda语句改成了一个具体的方法来执行,与lambda表达式同样的作用。

    再次谢谢,并且希望有更精彩的回答

    2012年11月12日 12:56
  • 是不是你的 url 本身就只返回空? VS 调试有什么提示没?光是看你的代码,我没看出错误来。
    2012年12月2日 12:49