ASP.NET虚拟文件系统
创始人
2024-04-18 14:21:25
0

在Asp.Net的开发过程中页面文件等都是放在当前网站目录下的,其实我们可以利用.Net2.0新增的ASP.NET虚拟文件系统(VirtualPathProvider)将页面、图片等信息保存到数据库或其他目录中去,达到灵活配置。

本文以一个例子来说明ASP.NET虚拟文件系统的使用,要实现的功能场景描述如下:
以前开发Asp.Net的web用户控件时,需要把用户控件和当前项目作为同一个项目时才能正常使用,而且发布时需要把dll文件和所有的ascx文件都发布才能使用;另外也不方便作为公用类给其他人使用
ASP.NET虚拟文件系统后可以把ascx文件作为资源打包到dll中,下次只要有这个dll就可以使用了,不需要ascx文件,很方便。

具体实现步骤如下:

一、开发web用户控件

这一步和以前的开发没有区别。
1、首先新建一个web应用程序(需要VS2005 sp1支持)
2、然后在里面开发几个web用户控件
3、在ascx文件上右键-〉属性-〉生成操作选择嵌入的资源
4、生成dll就可以了(dll的名字为:Test.Control.dll,后面会用到)

二、开发一个虚拟文件系统提供类

这一步是最重要的一步。

具体思路就是:在系统中注册这个类,然后在每访问一个文件/资源的时候会自动调用这个类,在这个类中判断文件的路径是否是我们定义的,如果是就用我们的逻辑来处理,即从dll中取出资源。

首先把类的代码贴出来,我想可能许多人应该和我一样,喜欢直接先看代码:

 

  1. DllVirtualPathProvider  
  2. public class DllVirtualPathProvider : System.Web.Hosting.VirtualPathProvider  
  3. {  
  4. public DllVirtualPathProvider()  
  5. {  
  6. }  
  7.  
  8. public override string CombineVirtualPaths(string basePath, string relativePath)  
  9. {  
  10. if (IsAppResourcePath(basePath))  
  11. {  
  12. return null;    
  13. }  
  14.  
  15. return Previous.CombineVirtualPaths(basePath, relativePath);    
  16. }  
  17.  
  18. public override System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType)  
  19. {  
  20. return Previous.CreateObjRef(requestedType);    
  21. }  
  22.  
  23. public override bool DirectoryExists(string virtualDir)  
  24. {  
  25. if (IsAppResourcePath(virtualDir))  
  26. {  
  27. return true;    
  28. }  
  29. else  
  30. {  
  31. return Previous.DirectoryExists(virtualDir);    
  32. }  
  33.  
  34. }  
  35.  
  36. public override string GetCacheKey(string virtualPath)  
  37. {  
  38. if (IsAppResourcePath(virtualPath))  
  39. {  
  40. return null;    
  41. }  
  42. else  
  43. {  
  44. return Previous.GetCacheKey(virtualPath);    
  45. }  
  46. }  
  47.  
  48. public override string GetFileHash(string virtualPath, 
    IEnumerable virtualPathDependencies)  
  49. {  
  50. if (IsAppResourcePath(virtualPath))  
  51. {  
  52. return null;    
  53. }  
  54. else  
  55. {  
  56. return Previous.GetFileHash(virtualPath, virtualPathDependencies);    
  57. }  
  58. }  
  59.  
  60. private bool IsAppResourcePath(string virtualPath)  
  61. {  
  62. String checkPath = VirtualPathUtility.ToAppRelative(virtualPath);    
  63. return checkPath.StartsWith("~/MyUserControl/Test.Control.dll/", 
    StringComparison.InvariantCultureIgnoreCase);    
  64. }  
  65.  
  66. public override bool FileExists(string virtualPath)  
  67. {  
  68. return (IsAppResourcePath(virtualPath) || Previous.FileExists(virtualPath));    
  69. }  
  70.  
  71. public override VirtualFile GetFile(string virtualPath)  
  72. {  
  73. if (IsAppResourcePath(virtualPath))  
  74. {  
  75. return new AssemblyResourceVirtualFile(virtualPath);    
  76. }  
  77. else  
  78. {  
  79. return Previous.GetFile(virtualPath);    
  80. }  
  81. }  
  82.  
  83. public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath,  
  84. System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)  
  85. {  
  86. if (IsAppResourcePath(virtualPath))  
  87. {  
  88. string path = HttpRuntime.AppDomainAppPath + virtualPath.Substring(1);    
  89.  
  90. return new System.Web.Caching.CacheDependency(path);    
  91. }  
  92. else  
  93. {  
  94. return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);    
  95. }  
  96. }  

【编辑推荐】

  1. 浅析ASP.NET中配置文件
  2. .NET RIA Services就像ASP.NET那样方便
  3. ASP.NET AJAX Extensions中UpdatePanel控件概述
  4. ASP.NET调用UpdatePanel的Update()方法
  5. 浅谈ASP.NET AJAX的WCF服务

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...