在很多年前,笔者在使用z-blog搭建个人部落格的时候,最大的感受就是z-blog在线安装功能!

因为在那个时候,以几K每秒的速度上传一个几M或者十几M的压缩包到虚拟主机上,是一个很痛苦的事情。特别是主机不支持在线解压功能,只能一个一个文件上传的时候。

虽然z-blog实现该功能的只有php版本与以前的ASP版本,但是对于asp.net,我们也可以做到同样的事情,只需要一个几K的ASPX文件,上传到服务器,就可以实现自动下载网站压缩包,解压并安装!

本来我担心bin目录文件变更,会引发异常,但是实测结果很好。

本文将通过三个步骤,实现现以下目标:

1.实现Asp.Net在线网站安装

2.尽量使用最少的文件(实际我们只需要一个aspx页)

步骤 一. 下载和解压

下载的话,我们可以直接使用WebClient下载即可,新建一个aspx页,命名叫  DownloadAndDeCompress.aspx  把对应的cs文件删掉,并删除页中所有内容,在第一行中输入以下代码:

<%@ Page Language="C#" AutoEventWireup="true" Async="true"  %>

注意这行的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();
} public void DeCompress(string fileName, string dirPath)
{
using (System.IO.Stream source = System.IO.File.OpenRead(fileName))
{
using (System.IO.Stream destination = new System.IO.MemoryStream())
{
using (System.IO.Compression.GZipStream input = new System.IO.Compression.GZipStream(source, System.IO.Compression.CompressionMode.Decompress, true))
{
byte[] bytes = new byte[];
int n;
while ((n = input.Read(bytes, , bytes.Length)) != )
{
destination.Write(bytes, , n);
}
}
destination.Flush();
destination.Position = ;
DeSerializeFiles(destination, dirPath);
}
}
} private void DeSerializeFiles(System.IO.Stream s, string dirPath)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter b = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.Collections.Generic.Dictionary<string, object> list = (System.Collections.Generic.Dictionary<string, object>)b.Deserialize(s);
DeFiles(list, dirPath);
} private void DeFiles(System.Collections.Generic.Dictionary<string, object> list, string dirPath)
{
foreach (System.Collections.Generic.KeyValuePair<string, object> n in list)
{
string newName = string.Concat(dirPath, n.Key.Remove(, ));
if (n.Key[] == '')
{
System.IO.Directory.CreateDirectory(newName);
if (n.Value != null)
{
DeFiles((System.Collections.Generic.Dictionary<string, object>)n.Value, dirPath);
}
}
else
{ using (System.IO.FileStream fs = new System.IO.FileStream(newName, System.IO.FileMode.Create, System.IO.FileAccess.Write))
{
byte[] bytes = (byte[])n.Value;
fs.Write(bytes, , bytes.Length);
fs.Close();
}
}
}
}
</script>

page_load中,我们直接通过webclient下载http://www.jiniannet.com/setup.zip这个安装包,第二个downloadFileCompleted方法用来向父页面输出下载完成事件与解压完成事件,第三个方法downloadProgressChanged则表示下载进度条。最后面的三个方法为解压相关方法。

这里我们用使用Flush来即时输出信息,再配合一个父页面,就可以做进度条处理效果,所以原则上最少会有二个文件,但是最终我们只会保留一个文件,这个在后面会讲到处理方法。

压缩算法的话,虽然现在压缩算法有很多种,像7Z,rar等压缩比例是相当高的,ZIP的压缩结果也不错,但是我们要考虑文件精减,如果这个在线安装包搞得比完整安装包还大,就完全没意义了,而且我们的最终追求目标是只需要一个aspx页面,除了这个aspx页面,不需要再下任何文件。所以,我选择在这里使用系统自带的Gzip算法,这样可以尽量解少我们的安装文件对外面DLL的依赖,与尽量减少安装文件的SIZE(注:不要被下载文件后缀ZIP迷惑,此ZIP也不能直接被压缩文件解压,具体原因我将会在下面讲到)。

至此,最主要的一个功能性页面已经完成,在下一篇文章,我将介绍如果制作网站安装包与最后的install.aspx页面制作。

(原创作品,转载请注明作者与出处,本文同时发布于www.jiniannet.com)

Asp.Net实现在线网站安装(上)的更多相关文章

  1. ASP.NET 获取来源网站的网址,获取上一网页的网址,获取来源网页的URL,获取上一网页的URL

    ASP.NET 获取来源网站的网址,获取上一网页的网址,获取来源网页的URL, 获取上一网页的URL Uri Url = HttpContext.Current.Request.UrlReferrer ...

  2. 腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践

    腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践.md 开通腾讯云服务器和Mysql 知识点: ASP.NET Core和 Entity Framework Core的使用 L ...

  3. ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序

    不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...

  4. Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]

    目录 [TOC] 1.CDH介绍 1.1.什么是CDH和CM? CDH一个对Apache Hadoop的集成环境的封装,可以使用Cloudera Manager进行自动化安装. Cloudera-Ma ...

  5. 微软官方网站线上兼容测试平台-Browser screenshots

    前端开发时最不想做的就是在不同浏览器.平台和分辨率测试网页显示效果,通常这会浮现许多问题,尤其浏览器版本就可能让显示成效完全不同,也只好尽力维持让每一种设备都能正常浏览网页.修改到完全没有问题必须投入 ...

  6. 如何将ASP.NET-WebApi发布到IIS6.0上(转)

    关于"如何将ASP.NET-WebApi发布到IIS6.0上"的这方面的学习,一开始项目组长让我们接触的时候,我的心情是这样的 哇呜.jpg 当时真的是一脸懵逼啊,对于刚接触asp ...

  7. asp.net core2.0网站的环境搭建和网站部署

    使用到的软件和硬件 1.       centos7.3服务器一台 2.       xshell.xftp 3.       vs2017 4.       .NET Core   1. 安装 li ...

  8. 360在线网站安全检测,web安全测试AppScan扫描工具,XSS常用的攻击手法

    360在线网站安全检测,web安全测试AppScan扫描工具,XSS常用的攻击手法 如何做好网站的安全性测试 360网站安全检测 - 在线安全检测,网站漏洞修复,网站后门检测http://websca ...

  9. ASP.Net Core MVC 网站在Windows服务器跑不起来

    1.vs远程发布到服务器,浏览器访问,报错502 2.打开错误提示提供的网址参考 3.安装runtime,sdk,Hosting Bundle Installer,其他操作 .....发现并没有什么用 ...

随机推荐

  1. 爬虫实战4:用selenium爬取淘宝美食

    方案1:一次性爬取全部淘宝美食信息 1. spider.py文件如下 __author__ = 'Administrator' from selenium import webdriver from ...

  2. 支持向量机通俗导论(SVM学习)

    1.了解SVM 支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是 ...

  3. P1642 规划

    题目链接 题意分析 一看就知道是一道\(01\)分数规划的题 我们二分值之后 跑树形背包就可以了 CODE: #include<iostream> #include<cstdio&g ...

  4. 使用sourceTree需要注意的地方

    1.使用CocoaPods 管理第三方库的时候,需要注意不要把Pod文件夹上传到版本管理服务器中 2.使用xcdoe的时候,还有一些个人用户数据也不要上传,可有效避免冲突的发生频率 3.团队开发的时候 ...

  5. leetcode-31-下一个排列

    本题目在凌应标老师的<算法设计与分析>第八次作业中出现,可供参考. 题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的 ...

  6. 11种绕过CDN查找真实IP方法

    0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有: http://ping.chin ...

  7. DataTables复杂表头

    工作上的需要,要做一个复杂的表头的DataTables thead如下 遇到的问题(详细问题可以浏览官网的答案 链接) 需自定义表头(thead),如果不自定义则会 Cannot read prope ...

  8. Python2获取网页标题

    Python获取网页标题 使用Python2.x的urllib2和lxml,速度应该还快于BeautifulSoup4(话说回来,为什么大家都要用BS4呢?一个XPATH不就完了吗) 没有安装过的,用 ...

  9. session_destroy()和session_unset()的理解

    session_destroy 是注销所有的session变量,并且结束session会话目前是删除当前用户对应的session文件以及释放session id值 ,但是但是 内存中的$_SESSIO ...

  10. JVectorMap地图插件.Net版开源

    jVectorMap地图插件只要浏览器技术JavaScript.CSS,HTML,SVG或VML就可以浏览使用,不需要Flash或其他专有的浏览 器插件.所以jVectorMap在所有现代移动浏览器上 ...