【永春】Asp.Net中虛擬檔案系統的使用
在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中取出資源。
首先把類的程式碼貼出來,我想可能許多人應該和我一樣,喜歡直接先看程式碼:)
1、必須從VirtualPathProvider類繼承
2、IsAppResourcePath方法是用來判斷是否為我們定義的路徑格式:~/MyUserControl/Test.Control.dll/,下面呼叫的時候就使用這個路徑
3、注意GetCacheKey方法:
另外所有的方法當不符合我們的條件時一定要呼叫 Previous.**** 因為系統中可能有多個虛擬檔案提供程式的。
4、GetCacheDependency方法:
5、在GetFile方法中我們返回的是一個AssemblyResourceVirtualFile類:
本文以一個例子來說明虛擬檔案系統的使用,要實現的功能場景描述如下:
以前開發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
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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);
}
}
}
重點有以下幾個:<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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);
}
}
}
1、必須從VirtualPathProvider類繼承
2、IsAppResourcePath方法是用來判斷是否為我們定義的路徑格式:~/MyUserControl/Test.Control.dll/,下面呼叫的時候就使用這個路徑
3、注意GetCacheKey方法:
public override string GetCacheKey(string virtualPath)
{
if (IsAppResourcePath(virtualPath))
{
return null;
}
else
{
return Previous.GetCacheKey(virtualPath);
}
}
這裡當符合條件時一定要返回null,如果返回"",會導致所有的使用者控制元件都使用一個key值,從而所有的使用者控制元件都顯示同樣的內容了。如果返回其他非空字元,會報異常(它會去查詢cache,我們是沒有的){
if (IsAppResourcePath(virtualPath))
{
return null;
}
else
{
return Previous.GetCacheKey(virtualPath);
}
}
另外所有的方法當不符合我們的條件時一定要呼叫 Previous.**** 因為系統中可能有多個虛擬檔案提供程式的。
4、GetCacheDependency方法:
if (IsAppResourcePath(virtualPath))
{
string path = HttpRuntime.AppDomainAppPath + virtualPath.Substring(1);
return new System.Web.Caching.CacheDependency(path);
}
這個方法是用來決定Cache的使用的,如果返回null,會導致效能嚴重下降,每次呼叫使用者控制元件時都會重新編譯,這裡返回的當前路徑(需要在網站目錄下再建立子目錄:MyUserControl\Test.Control.dll),這個目錄下是空的,這樣當每次取Cache時都會認為我們的ascx沒有修改,不需要重新編譯。{
string path = HttpRuntime.AppDomainAppPath + virtualPath.Substring(1);
return new System.Web.Caching.CacheDependency(path);
}
5、在GetFile方法中我們返回的是一個AssemblyResourceVirtualFile類:
class AssemblyResourceVirtualFile : VirtualFile
{
string path;
public AssemblyResourceVir
{
string path;
public AssemblyResourceVir
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-406688/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 詳解 Linux 中的虛擬檔案系統Linux
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- Linux 核心101:虛擬檔案系統的使命Linux
- 從rm到linux虛擬檔案系統Linux
- Linux系統中虛擬裝置檔案的各種實用用法Linux
- 從 lsof 開始,深入理解 Linux 虛擬檔案系統Linux
- Abp原始碼分析之虛擬檔案系統Volo.Abp.VirtualFileSystem原始碼
- win10系統怎麼使用自帶虛擬光碟機開啟iso映象檔案Win10
- VMware - 虛擬機器系統中無法使用鍵盤虛擬機
- Win10系統中虛擬桌面的使用方法Win10
- 如何實現Windows宿主系統和虛擬機器ubuntu系統檔案互相訪問Windows虛擬機Ubuntu
- veeambackup通過虛擬機器還原系統檔案操作說明虛擬機
- 通過虛擬機器學習作業系統引導檔案的配置虛擬機機器學習作業系統
- nodejs中的檔案系統NodeJS
- 防火牆的虛擬系統防火牆
- [武器化學習] 鯨髮卡系統虛擬卡系統任意檔案讀取漏洞poc
- 使用Kali官網提供的虛擬機器系統虛擬機
- [TIL] 在 Finder 中開啟 iOS 模擬器的檔案系統iOS
- minos 2.4 中斷虛擬化——中斷子系統
- Fedora 14系統中的虛擬化網路詳解
- Openwrt使用-虛擬機器使用IMG映象安裝系統虛擬機
- 在windows雙系統中,nginx配置虛擬域名WindowsNginx
- CRM系統中的文件檔案管理
- 關於虛擬模擬教學系統使用WebGL部署的痛點分析Web
- Ubuntu 新增虛擬記憶體檔案Ubuntu記憶體
- Linux系統中5款好用的虛擬機器軟體!Linux虛擬機
- 虛擬機器的檔案怎麼複製出來 如何把虛擬機器上的檔案拷到電腦上虛擬機
- 利用-flat.vmdk檔案恢復ESXI虛擬機器的vmdk檔案虛擬機
- MacOS 系統中如何設定 Python 虛擬環境MacPython
- Linux中Postfix虛擬使用者及虛擬域(六)Linux
- 在 Mac Catalina 的 root 目錄建立虛擬檔案Mac
- 使用 Fstransform 轉換檔案系統ORM
- Linux系統中建立檔案常用的方法!Linux
- Java虛擬機器——類檔案結構Java虛擬機
- 推薦2款檔案系統中查詢檔案的工具
- 5種快速查詢容器檔案系統中檔案的方法
- 如何往無頁面互動的虛擬機器中傳輸檔案虛擬機
- Ubuntu系統中修改hosts檔案Ubuntu
- 使用VM虛擬機器安裝CentOS-stream系統虛擬機CentOS