什么是forceBinFolderScan属性在EPiServerFramework.配置文件的含义



我正在学习EPiServer考试,并阅读了这篇关于EPiServer初始化的文章:http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-60/Initialization/

它描述了如何配置初始化以限制在启动期间扫描的程序集,但是有提到的forceBinFolderScan属性没有描述。Examples将它始终设置为true

我还发现了另一篇文章,描述了如何提高EPiServer网站的启动时间:http://world.episerver.com/Blogs/Alexander-Haneng/Dates/2011/12/Starting-CMS-6-R2-sites-faster-after-build/

作者说将该属性更改为false,但没有解释这是什么意思。设置它为false会停止扫描程序集还是只在某些条件下扫描它们?

我有一个相当大的网站,它需要几分钟的加载。我在bin文件夹中有很多程序集,所以想限制扫描只对那些包含一些初始化模块或插件。

. Net构建系统和应用程序启动优化算法所有程序集不能加载到app域中。这可能会在应用程序启动期间执行的EPiServer初始化系统中隐藏一些程序集。为了避免这种情况- EPiServer允许您设置此forceBinFolderScan标志来强制bin/文件夹(和探测文件夹对于v7)扫描程序集。如果标志设置为true - EPiServer不要求AppDomain加载程序集-而是扫描文件系统并加载尚未加载的dll。

对EPiServer源代码进行反编译,发现当forceBinFolderScan属性设置为true时使EPiServer框架扫描bin文件夹中的每个dll。它遍历所有dll并将它们加载到AppDomain中。

如果此属性设置为false,则不扫描bin文件夹,而是依赖于ASP。. NET程序集加载。

程序集从bin加载到AppDomain后(如果属性为false则未加载),它从AppDomain获取所有程序集,然后根据添加/删除配置过滤它们。所以添加/删除标签不会影响bin文件夹扫描。

实际上,这种行为和这种行为的原因在EPiServer文档中有描述:MEF - The Discovery Mechanism(见段落底部的注释)。作者只是没有提到它是由forceBinFolderScan属性控制的。

下面是一个描述这种行为的例子。

假设我们有两个程序集:MyPlugins.dll -其中包含一些插件和NoPlugins.dll。还要假设这些dll不是由ASP加载的。. NET

我们有这样的配置,告诉不强制扫描bin文件夹,包括所有程序集除了NoPlugins.dll:

  <scanAssembly forceBinFolderScan="false">
    <add assembly="*" />
    <remove assembly="NoPlugins.dll" />
  </scanAssembly>

在这样的配置下,MyPlugins.dllNoPlugins.dll在AppDomain中不会被加载并且无法被扫描。所以没有插件可用。

如果我们设置forceBinFolderScan="true":

  <scanAssembly forceBinFolderScan="true">
    <add assembly="*" />
    <remove assembly="NoPlugins.dll" />
  </scanAssembly>

通过这样的配置,两个dll都被显式地从bin文件夹加载到AppDomain中。然后过滤发生,NoPlugins.dll从模块/插件扫描集合中删除。因此,来自MyPlugins.dll的插件将被加载。

更新2

测试了不同的配置,看看优化是否有帮助,但似乎过滤程序集的结果更糟。

我的网站有相当多的程序集,所以需要很多时间来启动。我试了三种不同的方案。

1:

  <scanAssembly forceBinFolderScan="false">
    <add assembly="*" />
    <!-- Remove assemblies generated by EPiOptimizer -->
    <remove assembly="..." />
  </scanAssembly>

2:

  <scanAssembly forceBinFolderScan="false">
    <add assembly="*" />
  </scanAssembly>

3:

  <scanAssembly forceBinFolderScan="true">
    <add assembly="*" />
  </scanAssembly>

我分别进行了3次简单的测试- iisreset和Chrome刷新页面并检查时间轴(我知道这不是完美的测试),结果如下:

1: 1.3 min, 1 min, 1.3 min

2: 1 min, 57 s, 1 min

3: 57s, 57s, 57s

我以不同的顺序尝试了这些测试几次,但结果都是一样的。因此,通过添加标签进行优化是不合理的。似乎过滤掉加载在AppDomain中的程序集比扫描所有程序集更昂贵。奇怪的是,强制bin文件夹扫描给出了更好的结果,但可能是我的测试问题。

将该标志设置为true, EPiServer将在站点启动期间扫描bin文件夹,以查找具有EPiServer插件的程序集。此检测是通过加载程序集并检查它们是否具有具有EPiServer插件属性的类或EPiServer初始化模块来完成的。

您可以使用此工具检查哪些程序集可以从该部分中删除,以便缩短启动时间。

http://www.david-tec.com/2011/11/Optimising-EPiServer-start-up-times-during-build-with-EPiOptimiser/

将forceBinFolderScan设置为true时,EPiServer初始化引擎将扫描bin文件夹中的所有程序集。如果程序集包含对MEF (System.ComponentModel.Composition.dll)的引用,那么将扫描带有IInitializableModule属性标记的类。找到的任何类都将调用其Initialize方法。

如果将forceBinFolderScan设置为false,则不会扫描任何程序集,并且必须通过在scanAssembly元素中添加条目来显式地添加任何包含插件的程序集。如

<scanAssembly forceBinFolderScan="false">
   <add assembly="AssemblyWithPlugins.dll" />
</scanAssembly>

或者相反,您可以排除已知不包含插件的程序集,或者不希望被初始化引擎扫描和初始化的程序集:

<scanAssembly forceBinFolderScan="true">
   <remove assembly="AssemblyWithOutPlugins.dll" />
</scanAssembly>

只有扫描特定的程序集可以改善网站启动时间,但你必须记住更新列表与任何新的程序集添加,或在这些程序集中的任何插件将不会被EPiServer加载。

您可以在Log4Net日志中看到此活动,通过将日志级别设置为警告或更高,您将看到诸如"未扫描{0},因为它缺乏对MEF的任何引用"等消息。

有一篇很棒的博客文章是关于利用这个功能来改善网站启动时间的

相关内容

  • 没有找到相关文章

最新更新