我正在尝试创建一个虚拟文件。例如,我有一个组件从DB获取具有给定ID的CMS页面。现在我有一个类似/hello/world/
的网址,我想将网页/hello/world/
解析为ContentPlaceHolder
中的MasterPage
。
在IHttpModule
我能够捕获到URL,我可以将其重写为一个fysical文件。
那只是第1步,现在我需要加载一个不存在的虚拟页面。因此,我不认为我可以使用app.Context.RewritePath()
,因为它需要服务器上的一个物理文件。
问:有没有办法在ContentPlaceHolder
的{{1}}中呈现我的CMS页面组件?没有一个fysical文件?
我确实想知道如何组合IHttpModule并将文件重写为Masterpage
扩展名,然后使用.cmspage
来捕获该文件扩展名并加载我的组件,但这看起来似乎没有完成?
答案 0 :(得分:0)
当您调用ASP.NET页面时,IIS使用默认VirtualFileProvider
从IO加载文件,如果文件不在路径中,则会引发异常。好消息是您可以实现自定义提供程序并添加提供程序。因此,如果IO中不存在该文件,您可以从任何地方加载自己的内容(从DB加载,其他文件加载......)。
您可以使用它来加载虚拟ascx,aspx和所有ASP.NET文件扩展名。
首先,您需要编写自定义VirtualFile
和VirtualPathProvider
。然后使用HostingEnvironment.RegisterVirtualPathProvider
中的Global.asax
注册提供商。
这是从程序集资源获取文件内容(不存在)的一个很好的实现:http://www.codeproject.com/Articles/16803/Embedded-UserControls-Revisited