1

鉴于卸载动态编译的程序集(以回收内存)的唯一方法是卸载应用程序域,SharePoint 如何依赖 VirtualPathProviders,尤其是母版页和页面布局,而不会遇到此限制?

当母版页和页面布局频繁更新和发布时,可以通过各种设置延迟重启,但不能完全避免,对吗?

(缺乏这方面的信息是否归因于它是一个在发布模式中不常见的理论限制?您个人是否注意到母版页或布局的更改率导致应用程序不稳定?SharePoint 是否应该发出警告?)

任何利用动态 WebForms(默认情况下包括 MVC 视图)的 CMS 式功能都容易受到变化率不稳定性的影响,对吗?

非编译页面的更新:

无编译页面 在 ASP.NET 2.0 中,编译模型进行了重大重构和扩展。站点预编译可能是新功能中最受欢迎和要求最高的。另一个非常有趣的特性是无编译页面。它们是永远不会编译的特殊页面。那么无编译页面的最终目的是什么,它们与静态 HTML 页面有什么区别呢?首先,通过将 @Page 指令上的 CompilationMode 属性设置为 Never 来创建一个非编译页面。当请求非编译页面时,不会创建页面程序集并将其保存到磁盘。相反,页面构建器组件的一个实例被缓存在内存中,并用于为每个请求创建页面输出。页面构建器是一个特殊的组件,它支持页面解析器构建页面控制树。打开编译时,控制树用于获取要编译的类。当编译关闭时,控制树用于获取标记。不用说,如果你想让程序员有能力将自己的代码附加到页面上,类是必要的。非编译页面由服务器控件和文字组成,但根本不包含任何代码。

非编译页面并不适用于每个应用程序。它们专为提高具有数千页页面的大型网站的可扩展性而设计。非编译页面不能绑定到代码文件,也不能包含服务器端块。非编译页面中唯一允许的可执行代码是 $ 表达式。免编译页面有两个主要好处。在像 SharePoint 这样的安全环境中,无编译页面可防止开发人员编写可能导致托管环境出现问题甚至将其拆除的潜在错误代码。在基于内容的大型网站中,免编译页面避免了编译数千个页面的需要。

参考:

1http://haacked.com/archive/2009/04/22/scripted-db-views.aspx

4

2 回答 2

2

首先要注意的是自定义页面(可能是母版页或页面布局)始终存储在数据库中。

页面请求周期与普通 ASP.net 版本在 SPVirtualPathProvider 路由请求的方式上有所不同。一旦找到对自定义页面的请求(与位于文件系统上的未自定义页面相反,并且受制于通常的 ASP.net 页面编译模式),页面的代码就会从数据库中提取,交给 ASP .net 运行时,并以“无编译模式”进行解析。



以下是请求自定义页面时流程的可视化再现:

替代文字
赞美Shivprasad Koirala



这里也很好地描述了 ASP.net 的无编译模式

无编译页面:

无编译页面可以改进具有 1000 个页面的大型站点的缩放,因为 Windows 对加载到应用程序中的 DLL 数量有限制,并且当您达到此限制时性能会降低。将 <%@ Page CompilationMode="Auto" %> 指令设置为有条件地编译以获得缩放优势,而不受代码限制。您还可以将 CompilationMode 设置为“从不”以防止页面被编译。您可以在 Web.config 中的 <pages/> 部分设置此属性以应用于应用程序中的所有页面。非编译页面在包含用户代码时会引发错误。


因此,这基本上解决了您提到的关于在卸载/加载应用程序域时由于实时发生多个自定义而导致过度应用程序重置的问题(任何基于 ASP.net 运行时构建的 CMS 都必须解决的问题)。

最重要的是;以这种方式存储自定义内容时,您可以“免费”获得 SQL Server 的多用户功能和可扩展性;与需要额外努力来管理锁定的文件系统方法相反。

于 2009-10-16T22:46:20.043 回答
0

找到了一个很好的解释1

作为开发人员,您对此的最初反应可能是质疑为什么在非编译模式下处理自定义页面。您的直觉可能会告诉您编译页面比非编译页面运行得更快。但是,在某些情况下,无编译页面可能更高效且更具可扩展性。在大型 WSS 环境中尤其如此,其中自定义页面的数量可以达到数千或数万。

非编译页面可以加载到内存中,然后以编译页面无法实现的方式卸载,因为 .NET Framework 并不真正支持从内存中卸载程序集 DLL 的概念。最接近的等价物是回收当前的 Windows 进程或当前的 .NET AppDomain。但是,这种类型的回收涉及从内存中卸载所有程序集 DLL,而不仅仅是那些最近未使用的程序集 DLL。此外,.NET Framework 对可以加载到 .NET AppDomain 的程序集 DLL 的数量设置了上限。

无编译页面提供更高级别的可伸缩性,因为它们不需要将新的程序集 DLL 或托管类加载到内存中。相反,非编译页面的处理涉及将控制树加载到内存中。WSS 可以更有效地管理与自定义页面关联的控制树的内存使用,因为它们没有被编译成程序集 DLL。例如,一旦 WSS 完成了自定义页面的处理,它可以卸载页面的控制树以释放内存用于其他目的。此外,无编译页面消除了通过编译过程的需要,这实际上为首次访问的页面提供了更快的响应时间。

他们的关键在于可以卸载非编译页面(可以卸载相关的页面构建器),而编译页面则无法做到这一点。但从本质上讲,这是一种可扩展性措施(在此模型下可以处理更多页面)而不是性能增强(在初始设置之后,编译页面应该比未编译页面表现更好)。

1 - http://chiragrdarji.wordpress.com/2007/10/12/page-ghosting-unghosting-and-effect-of-pageghosting-on-performance-in-sharepoint-2007/

于 2009-10-17T15:04:53.353 回答