Asp.Net实现在线网站安装(上)——文件下载

翅膀的初衷

发表于2014-07-18 21:12:17

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算法来实网站文件的压缩与解压!