Silverlight技术研讨(1):WebClient, 文件下载利器

转自:http://www.silverlightchina.net/html/tips/2010/0322/880.html

Silverlight技术研讨(1):WebClient, 文件下载利器

时间:2010-03-22 15:35 来源:博客园 作者:erichan 点击: 456次
对于小型的Silverlight应用程序,可以把所有内容,包括资源,都包含在一个Xap包中发布。对于开发者来说,是个很便利的选择,可以把更多的精力和时间用到程序的功能方面,提高开发效率。但是对于使用者来说,如果xap文件过大,需要下载几分钟或者更长时间才能看到实际效
  
对于小型的Silverlight应用程序,可以把所有内容,包括资源,都包含在一个Xap包中发布。对于开发者来说,是个很便利的选择,可以把更多的精力和时间用到程序的功能方面,提高开发效率。但是对于使用者来说,如果xap文件过大,需要下载几分钟或者更长时间才能看到实际效果,可能是一个很糟糕的用户体验,一定需要很大的勇气和决心才会再次访问。为了解决初始下载主包时间太长的问题,开发者一般会把比较大的音频,视频和图片等资源从主包中剥离出来,使用动态下载方式。而无论是那种动态下载技术,WebClient类都扮演着十分重要的角色。我们需要深刻的认识和理解WebClient,才能更好的决定动态下载技术和策略。这一节作者首先介绍和剖析WebClient类。
 
首先看看官方的 在线帮助,是最权威的解释。用于上传服务器文件的方法就不提了,这里只关心用于下载的两个方法:DownloadStringAsync和OpenReadAsync,一个用于下载字符串,另一个下载文件流。使用方法很相像,以OpenReadAsync为例,值得注意的有这么几点:
1. 此方法使用 GET 方法检索指定的资源。资源是异步下载的。
2. 在完成第一个下载操作前,不能对同一 WebClient 对象再次调用 OpenReadAsync 方法。执行此操作会导致异常。
3. 如果 BaseAddress 属性不是空字符串,且地址不包含绝对 URI,则该地址必须是相对 URI,此 URI 与 BaseAddress 组合在一起构成所请求数据的绝对 URI。
 
第一点异步下载没什么好说的了,这对于好的用户体验是必须的,否则在下载过程中用户只能绝望的等待,不能看到一点进一步的信息,用户是会疯掉的。
第二点有点意思,是说一个WebClient 对象不可以同时进行两个下载,否则会导致异常。不过言外之意是,如果想要同时下载另外一个文件,可以创建一个新的WebClient 对象。作者未曾验证过,希望没有误解权威的意思。
第三点很重要,WebClient需要一个绝对地址来进行下载。你可以直接提供一个绝对地址,没问题。如果你打算用相对地址,则必须保证BaseAddress 与这个相对地址可以组合成正确的绝对地址。缺省时BaseAddress 为主xap包的地址,例如 http://localhost/ClientBin/MyApp.xap。那么你一定要保证相对地址是相对于 http://localhost/ClientBin/的。
 
注意对于DownloadStringAsync和OpenReadAsync 方法,还可以传递一个用户自定义的参数, userToken。“userToken 作为传递到在完成异步操作时调用的方法的 AsyncCompletedEventArgsUserState 属性接收。
举个例子来说,当调用OpenReadAsync 时,可以把文件名当作第二个参数。在注册的下载完成的方法里,e.UserState包含了该文件名,于是你就知道下载的是哪个文件了。
 
WebClient还有一个十分酷的特性,可惜官方帮助没有提及。WebClient可以与浏览器共享缓存文件!具体说来,如果你通过网页浏览已经缓存了某个文件,当你用WebClient下载这个文件时,WebClient会直接从缓存文件中直接读取,不再重新下载。反之亦然,WebClient下载的文件会保存在浏览器缓存目录中,供浏览器和WebClient下次使用。这可是实现silverlight动态下载并缓存的理论基础,十分重要!!
 
当然有些时候开发者并不想使用缓存文件。例如服务器文件更新了,希望下载最新的文件而不是缓存的文件。这种情况怎么处理呢?有人提出了一个解决办法:因为文件缓存是基于url的,如果在url后面加上一些随机的无意义的字符,例如?o=123,则可绕过缓存。缺点是每次下载都会增加新的缓存文件,浪费空间啊。
 
理论准备暂时就这么多了,后面文章将详细讲述WebClient在动态下载中的具体应用。

你可能感兴趣的:(silverlight)