技术开发 频道

Asp.Net中虚拟文件系统的使用

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

  本文以一个例子来说明虚拟文件系统的使用,要实现的功能场景描述如下:

  以前开发Asp.Net的web用户控件时,需要把用户控件和当前项目作为同一个项目时才能正常使用,而且发布时需要把dll文件和所有的ascx文件都发布才能使用;另外也不方便作为公用类给其他人使用
利用虚拟文件系统后可以把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);
            }
        }
    }

  

0
相关文章