在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中取出资源。
首先把类的代码贴出来,我想可能许多人应该和我一样,喜欢直接先看代码:
- DllVirtualPathProvider
- public class DllVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
- {
- public DllVirtualPathProvider()
- {
- }
- public override string CombineVirtualPaths(string basePath, string relativePath)
- {
- if (IsAppResourcePath(basePath))
- {
- return null;
- }
- return Previous.CombineVirtualPaths(basePath, relativePath);
- }
- public override System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType)
- {
- return Previous.CreateObjRef(requestedType);
- }
- public override bool DirectoryExists(string virtualDir)
- {
- if (IsAppResourcePath(virtualDir))
- {
- return true;
- }
- else
- {
- return Previous.DirectoryExists(virtualDir);
- }
- }
- public override string GetCacheKey(string virtualPath)
- {
- if (IsAppResourcePath(virtualPath))
- {
- return null;
- }
- else
- {
- return Previous.GetCacheKey(virtualPath);
- }
- }
- public override string GetFileHash(string virtualPath,
IEnumerable virtualPathDependencies)- {
- if (IsAppResourcePath(virtualPath))
- {
- return null;
- }
- else
- {
- return Previous.GetFileHash(virtualPath, virtualPathDependencies);
- }
- }
- private bool IsAppResourcePath(string virtualPath)
- {
- String checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
- return checkPath.StartsWith("~/MyUserControl/Test.Control.dll/",
StringComparison.InvariantCultureIgnoreCase);- }
- public override bool FileExists(string virtualPath)
- {
- return (IsAppResourcePath(virtualPath) || Previous.FileExists(virtualPath));
- }
- public override VirtualFile GetFile(string virtualPath)
- {
- if (IsAppResourcePath(virtualPath))
- {
- return new AssemblyResourceVirtualFile(virtualPath);
- }
- else
- {
- return Previous.GetFile(virtualPath);
- }
- }
- public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath,
- System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
- {
- if (IsAppResourcePath(virtualPath))
- {
- string path = HttpRuntime.AppDomainAppPath + virtualPath.Substring(1);
- return new System.Web.Caching.CacheDependency(path);
- }
- else
- {
- return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
- }
- }
- }
【编辑推荐】