WSS 超越 ASP.NET 的一个强项是可以在不改变前台 Web 文件系统的情况下,能够提供并且定制页面。通过 WSS 的这个能力,可以将 .aspx 和 .master 页面保存在内容数据库中,在处理请求的时候,可以从内容数据库中获取定制版本的 aspx 页面和 master 页面。
考虑一下页面定制工作在 WSS 中的工作。想象你想为某个特定的站点修改主页 default.aspx 的页面布局 ,当你修改完成并且保存页面的时候,WSS 将修改后的内容保存到内容数据库,然后,当这个页面被请求的时候,WSS 必须从内容数据库中获取这个定制页面,下面我们讨论实现的架构。
ASP.NET 2.0 引入了一个新的可插拔的组件称为:Virtual Path Provider,它抽象了 ASP.NET 获取页面的来源,默认情况下,ASP.NET 提供了一个基于文件系统的 Virtual Path Provider。通过创建一个自定义的 Virtual Path Provider,开发人员可以通过自定义的组件来从希望的位置获取页面,例如 SQL Server。
在 WSS 中,SPVirtualPathProvider 就是这样一个组件,这个组件通过 SPRequestModule 组件结合进处理过程,在 SPRequestModule 中包含注册 SPVirtualPathProvider 的代码
SPVirtualPathProvider 在 WSS 中扮演了一个关键角色,提供了页面的定制化,同时它还支持另外一个重要的称为 page ghosting 的优化。这是 WSS 跨越在 farm 中的所有站点,提供成千上万个页面的关键因素。
想象一下你刚刚通过空的站点模板创建了一个包含 100 个站点的 WSS。如果没有站点需要定制化的主页,还需要复制 100 个主页到内容数据库吗?当然不,在 WSS 站点中的页面,像 default.aspx 将会基于页面模板,保存在 Web 服务器的文件系统中。页面模板用来提供页面对象的实例,访问的地址类似:http://sample.com/default.aspx。
当通过页面模板提供页面实例的时候,对于没有定制化的页面,WSS 不需要访问内容数据库,而是通过文件系统来获取。这被称为 ghosting 的页面。
页面的 ghosting 消除了对于内容数据库的访问,也使得众多不同的站点使用同样的页面模板成为可能。对于每一个 Web 应用程序,页面模板将会被编译为 DLL ,加载到内容中,这些优化成为 WSS 在高访问量的环境下提高性能的关键因素。
当你修改一个页面,并保存定制化版本的时候,将会被保存到内容数据库中。就不能使用 ghosting page 了,必须从内容数据库获取定制化的版本,由于这个原因,定制化的页面有时被称为 unghosted page。