首页 / 软件开发 / Silverlight / 把WinForms开发的桌面应用移植到Silverlight开发的RIA(第2部分)
把WinForms开发的桌面应用移植到Silverlight开发的RIA(第2部分)2011-09-05 博客园 redmoon6,数据文件的部署之前,数据文件是通过ClickOnce一起和应用程序部署的。ClickOnce会自动判 断数据文件是否更新了,然后来确定是否下载这些数据文件。而在Silverlight中 ,如果把数据文件作为Content打包在XAP文件中,那么每次下载(或更新)XAP都 会下载这些数据文件。解决方法有两种:把数据文件单独放在一个程序集中,把 程序集设置为On-Demand下载或用Application Library Caching机制来缓存;或 者,自定义一个数据文件下载和升级的机制。我采用了第二种方式,即自定义了数据文件的下载更新机制,下面就详细介绍 。首先了解一下参考资料《Silverlight: Downloading Zipped files with the WebClient (stand Silverlight 2 beta 1)》http://www.galasoft.ch/mydotnet/articles/article-2008032301.html接着,说明一下我的思路:在承载Silverlight应用程序的Web应用程序上建立一个文件夹,如“LCADB”在Web端的LCADB目录中放置一个(或多个)数据文件的zip文件,和一个 manifest.xml文件来描述LCADB包含哪些文件,这些文件的最新更新时间每个zip文件都包含了若干xml文件,我的基础数据都是保存在xml文件中的如果是Out-Of-Browser的话,在Silverlight程序启动的时候,首先要检查是 应用程序本身否有更新,更新完毕提示用户重启应用程序,无更新则调用InstallOrUpdateDB如果不是OfB的话,要用InstallState属性来跳过应用程序更新的代码,直接 调用InstallOrUpdateDBInstallOrUpdateDB,检查是否已经分配独立存储区(我分配了100M,数据文 件解压后大致用到30M,其他可能作为临时空间,这点后面叙述)如果未分配,显示一个“Install DB”的按钮给用户,让用户点击以运行 IncreaseQuotaTo,这样做的原因是安全机制限制了IncreaseQuotaTo方法必须由 用户的事件所引发分配完成,接着调用CheckDBManifest如果已分配,直接调用CheckDBManifestCheckDBManifest,用来检查服务器上的manifest.xml内容,和本地保存的 manifest.xml进行比较以确定需要下载那些zip文件,这里是通过 DownloadStringAsync方法直接获得manifest.xml的文本内容如果需要下载zip文件,就调用DownloadAndExtract,DownloadAndExtract,用来下载zip文件并解压到独立存储区中,这里是通过 OpenReadAsync来获取文件流,在OpenReadAsync异步方法完成后,解压zip文件的内容到独立存储区中,解压 完成后,继续处理下一个需要下载的zip文件,并不断重复。在此处,我对 SharpZipLib进行扩展,可以把文件解压到独立存储区中。