none
为什么使用 webClient.DownloadStringCompleted出现数据丢失? RRS feed

  • 问题

  •  webClient.DownloadStringCompleted += (s, o) =>
                            {
                                if (o.Error == null)
                                {
                                    //获取数据
                                    XDocument xdoc = XDocument.Parse(o.Result);

        }

    };

     webClient.DownloadStringAsync(new Uri(cate.CateUrl));

    cate.CateUrl是一个XML网址,浏览器上打开可以看到数据,为什么o.Result有时有数据,有时就为空?

    我是一个方法,同时调用多次,每次的cate.CateUrl都不一样。

    求版主急求!


    • 已编辑 kotenkai 2012年12月14日 1:51
    2012年12月14日 1:34

答案

  • 你好,

    我测试了一下, 确实偶尔(概率很小)会出现你说的那种情况。

    出现这种情况的原因基本上和WebClient没有关系(虽然webClient通过HTTP协议请求下载数据,可能偶尔会出现点问题),这个和你的Silverlight应用程序有关,你可以仔细看一下上图中我标记的地方,前面一个页面中SilverlightApplication1.xap是没有传输到客户端的。

    你大可不必放弃HttpWebRequest,当你真正把你的应用程序host在server上后,上述问题发生的概率很小的,


    Mark Yu - MSFT
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 kotenkai 2012年12月19日 16:29
    2012年12月19日 11:49
    版主

全部回复

  • 你在url 后面加入时间戳  试试!

    比如?time=222222222 类似这样的


    认真的活,认真的爱!

    2012年12月15日 8:46
  • 跟这个没关系,考虑到是线程问题,这个方法是在foreach里面,执行7次或以上,每次的请求的连接都不一样,但如果把webClient实例化到foreach外面,每次请求的连接就变成一样,现在还没有解决,转换为HttpWebRequest的结果也是一样,考虑要放弃这种做法了。
    2012年12月17日 2:28
  • 你好,

    如果你的url是跨站的话,有些网站是限制webclient的download的操作,所以很多情况下是没有结果的。你使用的url最好是本项目的。

    对于跨站,你需要先创建cross policy,简单例子如下:

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
    <!--Enables Silverlight 3 all methods functionality-->
        <policy>
          <allow-from http-methods="*">      
            <domain uri="*"/>
          </allow-from>      
          <grant-to>      
            <resource path="/api" include-subpaths="true"/>
          </grant-to>      
        </policy>
    <!--Enables Silverlight 2 clients to continue to work normally -->
        <policy>
          <allow-from >      
            <domain uri="*"/>
          </allow-from>      
          <grant-to>      
            <resource path="/api" include-subpaths="true"/>
          </grant-to>      
        </policy>
      </cross-domain-access>
    </access-policy>
    

    详细信息请参考:

    http://msdn.microsoft.com/en-us/library/cc645032(v=vs.95).aspx

    http://blogs.msdn.com/b/silverlightws/archive/2008/03/30/some-tips-on-cross-domain-calls.aspx


    Mark Yu - MSFT
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月18日 8:21
    版主
  • Url是自己网站的,不过我会试试你的方法,谢谢
    2012年12月18日 9:03
  • 你好,

    如果Url是链接本项目里的,但是在for循环里执行7次,结果是有的时候有数据,有的时候没数据。

    如果可以的话,请你提供重现该问题的project(精简的,不涉及你隐私的),我可以帮你看看是什么问题。

    提供project,请上传到skydrive,然后把链接贴到这里,我会去下载的


    Mark Yu - MSFT
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月18日 10:41
    版主
  •  foreach (var cate in MyCateList)
         {

     WebClient webClient = new WebClient();

    webClient.DownloadStringCompleted += (s, o) =>
                            {
                                if (o.Error == null)
                                {
                                    //获取数据
                                    XDocument xdoc = XDocument.Parse(o.Result);

                           }

    };

      webClient.DownloadStringAsync(new Uri(cate.CateUrl));

    }

    cate.CateUrl就是多个XML网络连接,数据源不在外网,代码就是这些,如果你有数据源,可以试试看

    2012年12月19日 1:42
  • 你好,

    我测试了一下, 确实偶尔(概率很小)会出现你说的那种情况。

    出现这种情况的原因基本上和WebClient没有关系(虽然webClient通过HTTP协议请求下载数据,可能偶尔会出现点问题),这个和你的Silverlight应用程序有关,你可以仔细看一下上图中我标记的地方,前面一个页面中SilverlightApplication1.xap是没有传输到客户端的。

    你大可不必放弃HttpWebRequest,当你真正把你的应用程序host在server上后,上述问题发生的概率很小的,


    Mark Yu - MSFT
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 kotenkai 2012年12月19日 16:29
    2012年12月19日 11:49
    版主
  • 谢谢你的回复,我觉得可能跟请求速度与请求的数据量有关,我请求的下载的数据量比较多,然而每次请求的数据都不一样,在这个方法里面一瞬间请求多次,我怀疑和线程有关。如果只foreach 4次基本概率比较少,4次以上,概率比较大,数据量多空数据的概率也比较大。

    我正在寻求其它解决办法,这个方法我会保留,准备尝试你所说的host在server上的效果。

    2012年12月19日 16:29