SharePoint,VirtualPathProviders和应用程序重新启动

时间:2009-10-16 19:56:47

标签: asp.net asp.net-mvc sharepoint restart virtualpathprovider

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

重新启动可以通过各种设置延迟,但是当主页和页面布局经常更新和发布时,不能完全避免,是否正确?

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

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

无编译页面更新:

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

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

参考文献:

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

2 个答案:

答案 0 :(得分:2)

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

页面请求周期与SPVirtualPathProvider路由请求的方式不同于vanilla ASP.net版本。一旦发现请求是针对自定义页面(而不是位于文件系统上的非自定义页面,并且遵循通常的ASP.net页面编译模式),页面的代码将从数据库中提取,并传递给ASP .net运行时,并在“无编译模式”下解析。



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

alt text
致意{​​{3}}



Shivprasad Koirala

  

无编译页:

  没有编译页面可以改进   缩放大型网站1000   页面,因为窗口有数量限制   加载到app和perf的DLL   达到此限制时会降低。组   <%@ Page CompilationMode =“Auto”   %GT;指令编译   有条件地获得缩放   优点而不受代码限制。   您还可以将CompilationMode设置为   “从不”阻止页面永远   被编译。你可以设置它   < pages />上的属性部分   在Web.config中应用于所有页面   一个应用程序。一个无编译的页面会   包含用户时抛出错误   代码。


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

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

答案 1 :(得分:0)

找到了对此1

的一个很好的解释
  

作为开发者,您最初的反应   对此可能是质疑为什么   自定义页面在中处理   无编译模式。你的直觉很可能   告诉你编译的页面运行   比无编译页面更快。然而,   无编译页面可以更高效   在某些方面更具可扩展性   场景。尤其如此   一个大的WSS环境   自定义页面的数量可以达到   成千上万   数千人。

     

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

     

无编译页面提供更高级别的可伸缩性,因为   他们不需要加载新的   汇编DLL或托管类到   记忆。相反,处理   无编译页面涉及加载   控制树进入记忆。 WSS可以   管理内存使用情况   控制与之相关的树   更有效地定制页面   因为它们没有编译成   程序集DLL。例如,曾经是WSS   已完成处理定制   页面,它可以卸载页面的控件   树为其他人释放记忆   目的。此外,没有编译   页面消除了经历的需要   编译过程,哪个   实际提供更快的响应   首次访问时页面的次数。

它们的关键之处在于可以卸载无编译页面(可以卸载关联的页面构建器),这对于已编译的页面是不可能的。尽管如此,这是一种可扩展性测量(在此模型下可以处理更多页面)而不是性能增强(在初始设置之后,编译页面应该比非编译页面执行得更好)。

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