MSDN 上关于此类的说明是:
提供了一组方法,使 Web 应用程序可以从虚拟文件系统中检索资源。
很绕,到底是什么意思?
打个比方:
请求网站的 a.aspx 文件,该文件存在,则显示,不存在,就会出现 404 错误信息。
那么能不能这样,虽然这个文件不存在于服务器的文件系统,但我可以从数据库或者其它地方获取代表该文件的内容,然后让它代替这个文件正常显示呢?
OK!VirtualPathProvider 类就是干这个事儿的!
VirtualPathProvider 类的原理就是:所请求的路径都必须经过它,你可以对这个路径进行判断处理。怎么处理?一般来说,先检查请求路径的文件是否存在,存在则交给系统处理,否则就按照自己的逻辑进行处理。
等等,这么一来,如果文件存在而我不交给系统处理,那这个文件是不是就和不存在一样了?的确如此!是不是有了掌控的感觉?
那么具体如何使用呢?下面的代码就是一个最简单的应用例子,先看代码:
VirtualPathProvider 类是抽象类,必须自定义一个类继承它,我们给它起名字为:MyVPP
接下来重写两个方法:FileExists 和 GetFile。
FileExists 方法接收一个请求的路径,然后由你来决定告诉系统此路径是否有效。上面代码中返回 True 值,也就是通吃所有的路径。
当然,也可以不重写,那么就由基类判断路径是否存在,这样一来,这个类就失去意义了,所以是必须要重写的。
好了,下一步,既然你告诉系统这个路径有效,文件存在,那么系统就该问你要东西了,所以 GetFile 方法就是要向系统返回这个路径所代表的内容的。你可以返回字符、文本文件内容、XML、数据库值、资源文件里的内容、图片等等。上面的示例代码是先用基类的方法判断文件是否存在,存在则交由系统处理,不存在由自己处理。
当然,你还是可以不重写此方法,交由系统处理,同上面一样,就会失去这个类的意义。
所以所以,这两个方法是一定要重写滴。
GetFile 方法返回值是 VirtualFile 对象类型,该类也是抽象类,所以接下来就自定义一个它的子类,我们给它起名字为:MyVF
这个类有一个必须重写的方法:Open,返回类型是 Stream,也就是文件的内容流。上面的示例代码仅返回一个字符串,实际应用时可以根据需要从其它处获取内容。
OK!通过上面的描述,我们就应该清楚上面代码的整个流程了:首先,系统给你一个路径,让你说存在不存在,你说存在,好,那就给我文件的内容。
最后一个问题是:这个类怎么让生效?很简单,两种办法:
1.写一个过程:
然后把它放在 App_Code 文件夹下的任一类文件中。别担心,系统会自己找到它的。不过要注意的是,不要重复放,否则系统会很生气的。
2.把注册类的那一行代码写到 Global.asax 文件的 Application_Start 事件过程里。
效果:(a.aspx 不存在)

本文介绍如何利用VirtualPathProvider类在ASP.NET应用程序中实现自定义Web资源加载,包括路径验证、文件获取及自定义内容流生成。
171

被折叠的 条评论
为什么被折叠?



