ASP.NET虛擬文件系統(tǒng)
在Asp.Net的開(kāi)發(fā)過(guò)程中頁(yè)面文件等都是放在當(dāng)前網(wǎng)站目錄下的,其實(shí)我們可以利用.Net2.0新增的ASP.NET虛擬文件系統(tǒng)(VirtualPathProvider)將頁(yè)面、圖片等信息保存到數(shù)據(jù)庫(kù)或其他目錄中去,達(dá)到靈活配置。
本文以一個(gè)例子來(lái)說(shuō)明ASP.NET虛擬文件系統(tǒng)的使用,要實(shí)現(xiàn)的功能場(chǎng)景描述如下:
以前開(kāi)發(fā)Asp.Net的web用戶控件時(shí),需要把用戶控件和當(dāng)前項(xiàng)目作為同一個(gè)項(xiàng)目時(shí)才能正常使用,而且發(fā)布時(shí)需要把dll文件和所有的ascx文件都發(fā)布才能使用;另外也不方便作為公用類(lèi)給其他人使用
ASP.NET虛擬文件系統(tǒng)后可以把a(bǔ)scx文件作為資源打包到dll中,下次只要有這個(gè)dll就可以使用了,不需要ascx文件,很方便。
具體實(shí)現(xiàn)步驟如下:
一、開(kāi)發(fā)web用戶控件
這一步和以前的開(kāi)發(fā)沒(méi)有區(qū)別。
1、首先新建一個(gè)web應(yīng)用程序(需要VS2005 sp1支持)
2、然后在里面開(kāi)發(fā)幾個(gè)web用戶控件
3、在ascx文件上右鍵-〉屬性-〉生成操作選擇嵌入的資源
4、生成dll就可以了(dll的名字為:Test.Control.dll,后面會(huì)用到)
二、開(kāi)發(fā)一個(gè)虛擬文件系統(tǒng)提供類(lèi)
這一步是最重要的一步。
具體思路就是:在系統(tǒng)中注冊(cè)這個(gè)類(lèi),然后在每訪問(wèn)一個(gè)文件/資源的時(shí)候會(huì)自動(dòng)調(diào)用這個(gè)類(lèi),在這個(gè)類(lèi)中判斷文件的路徑是否是我們定義的,如果是就用我們的邏輯來(lái)處理,即從dll中取出資源。
首先把類(lèi)的代碼貼出來(lái),我想可能許多人應(yīng)該和我一樣,喜歡直接先看代碼:
- 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);
- }
- }
- }
【編輯推薦】