在某些特殊的情况下,网站常规的文件、目录组织方式不能满足要求,在Asp.net 2.0提供了一些类来实现自己的虚拟文件系统,可以把网站文件保存在Zip文件里、保存在自己定制格式的二进制文件中甚至数据库中。这些类在System.Web.Hosting命名空间内定义,如:VirtualPathProvider、VirtualFile、VirtualDirectory等等。
以前实现页面或文件隐藏,可以继承IHttpHandler,IHttpModule,然后在web.comfig文件中配置,与之相比,VirtualPathProvider更强大。
可以映射到储在虚拟文件系统中的文件或文件夹包括:
1.定制自己的虚拟路径提供者
继承VirtualPathProvider类。
2.定制自己的虚拟文件
继承VirtualFile类。
3.注册虚拟路径提供者。
注册方法有三种。
(1)AppInitialize这个特殊方法中注册:
(2)在Global.asax的Application_Start方法中注册。
(3)继承IHttpModule,在HttpApplication.BeginRequest的事件处理程序中注册。
web.config中配置:
运行可以看到能够找到虚拟文件。

参考资料:http://msdn.microsoft.com/zh-cn/library/system.web.hosting.virtualpathprovider.aspx
示例下载:点击下载
以前实现页面或文件隐藏,可以继承IHttpHandler,IHttpModule,然后在web.comfig文件中配置,与之相比,VirtualPathProvider更强大。
可以映射到储在虚拟文件系统中的文件或文件夹包括:
ASP.NET 页、母版页、用户控件以及其他对象。
具有 .htm 和 .jpg 这样的扩展名的标准网页。
映射到 BuildProvider 实例的任何自定义扩展名。
App_Theme 文件夹中的任何命名主题。
但虚拟文件系统中不能存储下面的文件夹或文件:
具有 .htm 和 .jpg 这样的扩展名的标准网页。
映射到 BuildProvider 实例的任何自定义扩展名。
App_Theme 文件夹中的任何命名主题。
Global.asax 文件。
Web.config 文件。
供 XmlSiteMapProvider 使用的站点地图数据文件。
包含或生成应用程序程序集的目录:Bin、App_Code、App_GlobalResources 以及任何 App_LocalResources 目录。
应用程序数据文件夹 App_Data。
Web.config 文件。
供 XmlSiteMapProvider 使用的站点地图数据文件。
包含或生成应用程序程序集的目录:Bin、App_Code、App_GlobalResources 以及任何 App_LocalResources 目录。
应用程序数据文件夹 App_Data。
1.定制自己的虚拟路径提供者
继承VirtualPathProvider类。
using System.IO;
using System.Web;
using System.Web.Hosting;
using System.Text;
namespace Xianfen.Net.MyVirtualPathProvider_File
{
public class MyVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
virtualPath = virtualPath.ToLower();
if (virtualPath.EndsWith("myvirtualfile.aspx"))
{
return true;
}
else
{
return Previous.FileExists(virtualPath);
}
}
public override VirtualFile GetFile(string virtualPath)
{
virtualPath = virtualPath.ToLower();
if (virtualPath.EndsWith("myvirtualfile.aspx"))
{
return new MyVirtualFile(virtualPath);
}
else
{
return Previous.GetFile(virtualPath);
}
}
}
}
using System.Web;
using System.Web.Hosting;
using System.Text;
namespace Xianfen.Net.MyVirtualPathProvider_File
{
public class MyVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
virtualPath = virtualPath.ToLower();
if (virtualPath.EndsWith("myvirtualfile.aspx"))
{
return true;
}
else
{
return Previous.FileExists(virtualPath);
}
}
public override VirtualFile GetFile(string virtualPath)
{
virtualPath = virtualPath.ToLower();
if (virtualPath.EndsWith("myvirtualfile.aspx"))
{
return new MyVirtualFile(virtualPath);
}
else
{
return Previous.GetFile(virtualPath);
}
}
}
}
2.定制自己的虚拟文件
继承VirtualFile类。
namespace Xianfen.Net.MyVirtualPathProvider_File
{
public class MyVirtualFile : VirtualFile
{
private string myPath;
public MyVirtualFile(string virtualPath)
: base(virtualPath)
{
myPath = virtualPath;
}
public override Stream Open()
{
Stream stream = new MemoryStream();
StreamWriter sw = new StreamWriter(stream);
StreamReader sr = null;
try
{
if (myPath.EndsWith("myvirtualfile.aspx"))
{
sr = new StreamReader(
HttpContext.Current.Server.MapPath("~/App_Data/htm.txt"), Encoding.UTF8);
}
sw.Write(sr.ReadToEnd());
sw.Flush();
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
finally
{
if (sr != null)
{
sr.Close();
sr.Dispose();
}
}
}
}
}
{
public class MyVirtualFile : VirtualFile
{
private string myPath;
public MyVirtualFile(string virtualPath)
: base(virtualPath)
{
myPath = virtualPath;
}
public override Stream Open()
{
Stream stream = new MemoryStream();
StreamWriter sw = new StreamWriter(stream);
StreamReader sr = null;
try
{
if (myPath.EndsWith("myvirtualfile.aspx"))
{
sr = new StreamReader(
HttpContext.Current.Server.MapPath("~/App_Data/htm.txt"), Encoding.UTF8);
}
sw.Write(sr.ReadToEnd());
sw.Flush();
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
finally
{
if (sr != null)
{
sr.Close();
sr.Dispose();
}
}
}
}
}
3.注册虚拟路径提供者。
注册方法有三种。
(1)AppInitialize这个特殊方法中注册:
public static void AppInitialize()
{
HostingEnvironment.
RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
{
HostingEnvironment.
RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
(2)在Global.asax的Application_Start方法中注册。
protected void Application_Start(object sender, EventArgs e)
{
HostingEnvironment.
RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
{
HostingEnvironment.
RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
(3)继承IHttpModule,在HttpApplication.BeginRequest的事件处理程序中注册。
public class MyIHttpModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HostingEnvironment.
RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
}
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HostingEnvironment.
RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
}
web.config中配置:
<httpModules>
<add name="MyModule"
type="Xianfen.Net.MyVirtualPathProvider_File.MyIHttpModule, Xianfen.Net.MyVirtualPathProvider_File"/>
</httpModules>
<add name="MyModule"
type="Xianfen.Net.MyVirtualPathProvider_File.MyIHttpModule, Xianfen.Net.MyVirtualPathProvider_File"/>
</httpModules>
运行可以看到能够找到虚拟文件。

参考资料:http://msdn.microsoft.com/zh-cn/library/system.web.hosting.virtualpathprovider.aspx
示例下载:点击下载
分类:
ASP.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)