z-blog是国内一款比较有名的BLOG程序,它已出过ASP,php,.NET等三个版本,拥有大量用户。在使用z-blog的过程中,我最大的感受就是Z-BLOG的在线安装,相当方便!因为相对于虚拟主机用户来说,十几M的压缩包下载下来,然后还要FTP上传到服务器是一个很痛苦的事件,如果主机不支持在线解压,那就更加麻烦。在这里,我教大家如何实现Asp.Net 在线网站安装的功能
在之前,其实我是有点怀疑该功能是不是可以实现的,因为如果Bin目录发生变更,ASP.NET将重新启动应用程序,但根据我的测试,Asp.Net在线网站安装是完全可实现的。
首先,说下我们的最终目标:
1.实现Asp.Net在线网站安装2.尽量使用最少的文件(我们只需要一个aspx页)
实现在线安装,包括三个步骤,即:1.下载2.解压3.执行安装
下载的话,我们可以直接使用WebClient下载即可,新建一个aspx页,命名叫 DownloadAndDeCompress.aspx 把相关的cs文件删掉,把页面第一行,修改如下:
<%@ Page Language="C#" AutoEventWireup="true" Async="true" %>
删除cs文件,主要是不想进行编译,尽量减少安装文件的文件数量与尺寸。我们将代码直接写在页面中,可以让它像ASP或者PHP一样,边解释边执行。
注意第一行的Async="true"这句,这是表示当前页面允许异步执行,因为我们等下需要在下载时做进度条,所以必须加上此项。
然后下载代码如下:
<script type="text/C#" runat="server"> protected void Page_Load(object sender, EventArgs e) { using (System.Net.WebClient wc = new System.Net.WebClient()) { wc.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(downloadProgressChanged); wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(downloadFileCompleted); wc.DownloadFileAsync(new Uri("http://www.jiniannet.com/setup.zip"), Server.MapPath("~/setup.zip")); } } private void downloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { Response.Write("<script>window.parent.DeCompress()</"+"script>"); Response.Flush(); DeCompress(Server.MapPath("~/setup.zip"), Server.MapPath("~/")); Response.Write("<script>window.parent.DeCompressCompleted()</"+"script>"); Response.Flush(); } private void downloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e) { //script Response.Write("<script>window.parent.DownloadProgressChanged(" + e.ProgressPercentage.ToString() + ")</"+"script>"); Response.Flush(); } </script>
这里我们用使用Flush来即时输出信息,再配合一个父页面,就可以做进度条处理效果,所以原则上最少会有二个文件,但是最终我们只会保留一个文件,这个在后面会讲到处理方法。
下载完成后,我们就可以调用DeCompress方法用进解压缩了,压缩的话,我们也有很多限制。
虽然现在压缩算法有很多种,像7Z,rar等压缩比例是相当高的,ZIP的压缩结果也不错,但是我们要考虑文件精减,如果这个在线安装包搞得比完整安装包还大,就完全没意义了,而且我们的最终追求目标是只需要一个aspx页面,除了这个aspx页面,不需要再下任何文件。所以,我选择在这里使用Gzip算法,下一篇,我将介绍如何实现Gzip算法来实网站文件的压缩与解压!