Asp.net压缩网站中的文件

news/2024/5/9 5:52:05/文章来源:https://blog.csdn.net/weixin_30951231/article/details/98803990

为了说明自定义虚拟路径,这里弄个示例,仅仅用一个压缩包存放一个网站的多个文件。

  这个东西是要需要通过实现3个抽象类来实现:

  • System.Web.Hosting.VirtualPathProvider;
  • System.Web.Hosting.VirtualDirectory;
  • System.Web.Hosting.VirtualFile;

  因为,我真的不知道如何去缩减,代码比较多。首先新建一个Web项目,然后添加如下3个类:

  1、虚拟目录提供者类:

    public class ZipVirtualPathProvider : System.Web.Hosting.VirtualPathProvider{private string fileRootPath; private string virtualRootPath; private ZipVirtualDirectory root; public ZipVirtualPathProvider() { this.fileRootPath = HttpRuntime.AppDomainAppPath; this.virtualRootPath = HttpRuntime.AppDomainAppVirtualPath + "/"; string path = string.Format("{0}App_Data\\test.zip", fileRootPath); using (ZipFile zipFile = new ZipFile(path)) { // 创建根目录 this.root = new ZipVirtualDirectory(virtualRootPath); foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry entry in zipFile) { string name = string.Format("{0}{1}", this.virtualRootPath, entry.Name); VirtualDirectory parent = GetParentDirectory(name); ZipVirtualDirectory zipParent = parent as ZipVirtualDirectory; System.Web.Hosting.VirtualFileBase vfb; if (entry.IsDirectory) { vfb = new ZipVirtualDirectory(name); } else { System.IO.Stream stream = zipFile.GetInputStream(entry); int size = (int)entry.Size; byte[] buffer = ReadAllBytes(stream, size); vfb = new ZipVirtualFile(name, buffer); } zipParent.AddVirtualItem(vfb); } } } //寻找子目录所属的父目录 private VirtualDirectory GetParentDirectory(string virtualPath) { // 从根目录开始找,直到找不到为止,说明就是所属的父目录,加入父目录中 VirtualDirectory root = this.root; while (true) { bool isContinue = false; foreach (VirtualDirectory dir in root.Directories) { if (virtualPath.StartsWith(dir.VirtualPath)) { root = dir; isContinue = true; break; } } if (isContinue) continue; // 如果都不是,那么,当前的 root 就是其父目录 return root; } } //是否存在目录 public override bool DirectoryExists(string virtualDir) { /// 从根目录开始递归寻找 bool result = SearchDirectory(this.root, virtualDir); if (result) { return true; } return this.Previous.DirectoryExists(virtualDir); } //搜索目录 private bool SearchDirectory(VirtualDirectory parent, string virtualDir) { if (parent.Name == virtualDir) { return true; } foreach (VirtualDirectory child in parent.Directories) { bool result = SearchDirectory(child, virtualDir); if (result) { return true; } } return false; } //判断文件是否存在 public override bool FileExists(string virtualPath) { //只检查压缩包的一级目录(有就有,没有就没有) foreach (VirtualFile file in this.root.Files) { if (file.Name.Replace("//", "/") == virtualPath) { return true; } } return this.Previous.FileExists(virtualPath); } public override System.Web.Hosting.VirtualDirectory GetDirectory(string virtualDir) { VirtualDirectory dir = GetParentDirectory(virtualDir); // 不存在的话,找到父目录,存在的话,找到自己。 bool exist = dir.VirtualPath == virtualDir; if (exist) { return dir; } return this.Previous.GetDirectory(virtualDir); } public override System.Web.Hosting.VirtualFile GetFile(string virtualPath) { //找到可能存在的目录 VirtualDirectory dir = GetParentDirectory(virtualPath); // 遍历查找 foreach (VirtualFile file in dir.Files) { if (file.VirtualPath == virtualPath) { return file; } } return this.Previous.GetFile(virtualPath); } public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) { // 由于采用了压缩文件,所以不生成缓存依赖对象 return null; } private byte[] ReadAllBytes(System.IO.Stream stream, int size) { byte[] buffer = new byte[size]; int count = stream.Read(buffer, 0, size); return buffer; } }

  虚拟目录与虚拟文件类:

    public class ZipVirtualDirectory : System.Web.Hosting.VirtualDirectory{//保存文件夹中包含的子项目的集合 //包括文件和子目录 private List<VirtualFileBase> items; private List<VirtualFile> files; private List<VirtualDirectory> directories; private string name; public override System.Collections.IEnumerable Files { get { return this.files; } } public override System.Collections.IEnumerable Children { get { return this.items; } } public override System.Collections.IEnumerable Directories { get { return directories; } } public override string Name { get { return base.Name; } } public ZipVirtualDirectory(string name) : base(name) { this.items = new List<VirtualFileBase>(); this.directories = new List<VirtualDirectory>(); this.files = new List<VirtualFile>(); this.name = name; } // 在目录中增加一个项目 public void AddVirtualItem(VirtualFileBase item) { this.items.Add(item); if (item.IsDirectory) { this.directories.Add(item as VirtualDirectory); } else { this.files.Add(item as VirtualFile); } } } public class ZipVirtualFile : System.Web.Hosting.VirtualFile { public override string Name { get { return this.name; } } public override System.IO.Stream Open() { return new System.IO.MemoryStream(this.buffer); } private string name; private byte[] buffer; public ZipVirtualFile(string name, byte[] buffer) : base(name) { this.name = name; this.buffer = buffer; } }

  注册虚拟目录提供程序,在App_Code目录里面添加一个AppStart类:

    public class AppStart{public static void AppInitialize() { ZipVirtualPathProvider virtualPathProvider = new ZipVirtualPathProvider(); System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(virtualPathProvider); } }

  然后新建一个zip压缩包,里面有如下两个页面:

  

  然后启动项目,打开路径:/test/1.html。

  

  网站程序中是不存在"test"这个目录的,但是自定义的虚拟目录将对此路径的访问映射到"test.zip"里面的1.html去了。这就是自定义虚拟路径提供器的强大之处。

转载于:https://www.cnblogs.com/jameslif/p/4966768.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_749135.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

网站的SEO以及它和站长工具的之间秘密(转)

博客迁移没有注意 URL 地址的变化&#xff0c;导致百度和 google 这两只爬虫引擎短时间内找不到路。近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具&#xff0c;说下感受。 百度的站长工具地址&#xff1a;http://zhanzhang.baidu.com/dashboard/ind…

大型网站技术架构(八)网站的安全架构

2019独角兽企业重金招聘Python工程师标准>>> 从互联网诞生起&#xff0c;安全威胁就一直伴随着网站的发展&#xff0c;各种Web攻击和信息泄露也从未停止。常见的攻击手段有XSS攻击、SQL注入、CSRF、Session劫持等。 1、XSS攻击 XSS攻击即跨站点脚本攻击&#xff08;…

Nodejs建站笔记-注册登录流程的简单实现

1. 使用Backbone实现前端hash路由 登录注册页面如下&#xff1a; 初步设想将注册和登录作为两个不同的url实现&#xff0c;但登录和注册功能的差距只有form表单部分&#xff0c;用两个url实现显然开销过大&#xff0c;所以最终方案为使用hash作为前端路由&#xff0c;根据url的…

搜索引擎优化(SEO)解决方案

搜索引擎优化&#xff08;SEO&#xff09;解决方案 在此之前&#xff0c;希望大家能重新审视搜索引擎&#xff0c;通俗来讲就是我们日常所用的百度、谷歌、搜狗、雅虎等。磨刀不误砍柴工&#xff0c;知己知彼&#xff0c;百战不殆&#xff01; 一、搜索引擎是什么&#xff1f; …

关于大型网站技术演进的思考(一)--存储的瓶颈(1)

转自&#xff1a;http://www.cnblogs.com/sharpxiajun/p/4237704.html 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训&#xff0c;两天12个小时信息量非常大&#xff0c;知识的广度和难度也非常大&#xff0c;培训完后我很难完整理出全部听到的知识&a…

怎样高效利用PPT模板网站找到适合自己的PPT模板

我相信许多人喜欢在需要制作PPT时制作PPT。虽然我已经学到了很多PPT制作技巧&#xff0c;但我也收集了很多图片&#xff0c;图标&#xff0c;PPT模板等&#xff0c;但是当我真正使用它时&#xff0c;我仍然不知道该怎么做&#xff0c;然后我只是用了模板直接&#xff0c;节省时…

电子商务网站比较常用的缓存策略架构

缓存是分布式系统中的重要组件&#xff0c;主要解决高并发&#xff0c;大数据场景下&#xff0c;热点数据访问的性能问题。提供高性能的数据快速访问。 这次主要是分享下自己觉得比较通用的一个缓存策略的架构方案,也是比较 容易理解的.欢迎吐槽. 有更牛逼的也欢迎大家说下: 缓…

Cookie注入靶场:模拟公司网站

靶场 这是一个靶场的样子 随意点击一个连接&#xff0c;发现是有id号的&#xff0c;但是id前面有shownews.asp这个东西。这个就是典型的Cookie注入标志 Cookie注入标志 有着如同.asp?idxxx的url通常我们先去掉前面的?idxxx 看它是否显示正常&#xff0c;如果不正常&#x…

css 背景透明_想给网站换个背景图?这个神器提供超多免费素材

网页比较少有背景图需求&#xff0c;多半都是以单色为主&#xff0c;如果觉得略显单调&#xff0c;也能使用纹理材质或渐层色做为背景&#xff0c;例如 Paper-co 就有许多日系的纸张纹理材质可用做背景&#xff0c;不仅看起来可以提升质感&#xff0c;也不会影响阅读造成负担&a…

python检测端口是否被占用_「查看端口占用」Windows下如何查看某个端口被谁占用并强制关闭 - seo实验室...

查看端口占用一、查看那个端口被调用我告诉大家一个方法&#xff0c;^_^。1、 开始—->运行—->cmd&#xff0c;或者是windowR组合键&#xff0c;调出命令窗口&#xff1b;2、输入命令&#xff1a;netstat -ano&#xff0c;列出所有端口的情况。在列表中我们观察被占用的…

SEO深度解读之HITS链接分析算法

HITS(Hyperlink - Induced Topic Search)链接分析算法诞生在1997年&#xff0c;该算法是由康奈尔大学中的一位博士提出&#xff0c;并且该算法沿用于全球多个搜索引擎当中。当然&#xff0c;不同的搜索引擎针对于该算法的侧重点和内部公式都有不一的算法结构调整&#xff0c;并…

linux smb 远程,测试过程、扩展研究 - Linux系统下用smbclient命令来访问Windows共享_Linux教程_Linux公社-Linux系统门户网站...

基本测试过程如下&#xff1a;1、 访问c$共享&#xff1a;[rootrh root]# smbclient //192.168.60.188/c$ -U cmwPassword:smb: \> cd winntsmb: \winnt\>2、 访问temp共享(启用guest帐户)[rootrh root]# smbclient //192.168.60.188/tempPassword:(未输入任何密码)smb: …

《网站情感化设计与内容策略》一1.6 情感和记忆

本节书摘来自异步社区《网站情感化设计与内容策略》一书中的第1章&#xff0c;第1.6节&#xff0c;作者 【美】Aarron Walter , Erin Kissane&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 情感和记忆 情感体验在我们的长期记忆中会留下深刻的印记。我…

网站的第一印象

个人觉得商业网站的风格还是简洁点好&#xff0c;看起来舒服&#xff0c;就可以了&#xff0c;没必要去追求什么视觉冲击力。如果是个人主页做得个性点&#xff0c;要求视觉冲击力&#xff0c;可以让人留下深刻的印象&#xff0c;不过要求视觉冲击力的个人主页&#xff0c;一般…

百度网站收录教程(个人版)

让百度搜索到有两种方法&#xff0c;一种是等百度主动来爬取你的网站&#xff0c;还有一种是你自己主动提交给百度告诉它来爬取。第一种周期太过漫长&#xff0c;所以本文就讲第二种 1.准备网站 首先&#xff0c;想要做SEO的同学&#xff0c;需要考虑清楚所选择的前端框架。现在…

超神奇的四个在线网站,万万没想到他们竟然这么好用!

说起一下在线网站我们多多少少能够知道一些比较好用的网站&#xff0c;但是今天小编要分享的这些网站要比我们之前介绍的一些网站还要好用&#xff01;你们准备好了吗&#xff1f; 一.放大图片 网址&#xff1a;http://waifu2x.udp.jp/index.zh-CN.html 图片太小&#xff1f;想…

c语言 界面编程 毕业设计,《C语言程序设计》课程网站的设计与实现(ASP.NET,SQL)...

《C语言程序设计》课程网站的设计与实现(asp.NET,SQL)(毕业论文12000字,程序代码,SQLserver数据库)本课程网站采用C#语言和asp.net技术并利用SqlSever数据库进行开发&#xff0c;结合了B/S框架技术&#xff0c;实现课程教学管理新方式&#xff0c;主要是针对管理员&#xff0c;…

网站截图工具EyeWitness

2019独角兽企业重金招聘Python工程师标准>>> 网站截图工具EyeWitness 在网页分析和取证中&#xff0c;往往需要大批量的网站截图。Kali Linux提供了一款网站批量截图工具EyeWitness。该工具不仅支持网址列表文件&#xff0c;还支持Nmap和Nessus报告文件。在Web请求的…

php qq授权_网站接入QQ登录(PHP版)【最新教程 05.14更新】,亲身失败百次的总结...

开发阶段(偏前端的同学可以查看 JS版 教程)3.1. QQ互联 官网提供了 SDK 以及对应的 示例代码&#xff0c;但是为了帮助同学们更好理解&#xff0c;我进行了部分删减&#xff0c;力求最简单的方法实现目的。官方SDK3.2. 因为是写教程&#xff0c;所以代码就尽量简单明了一点。实…