ASP.NET虚拟文件系统

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

创新互联是一家专注于成都网站制作、成都网站设计与策划设计,仪征网站建设哪家好?创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:仪征等地区。仪征做网站价格咨询:18982081108

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

当前文章:ASP.NET虚拟文件系统
网站地址:http://www.shufengxianlan.com/qtweb/news5/24805.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联