使用ClientBuildManager.CompileFile进行就地编译

我正在开发一个我想使用就地编译的网站,以便让第一次点击更快。 我想使用ClientBuildManagerCompileFile方法进行就地编译,这样我就可以控制编译过程。 由于各种原因,这是编译本网站的理想方式。

为什么IIS在“临时ASP.NET文件”下构建到不同的子目录?

当我通过ClientBuildManager按文件编译网站文件时。 在为此目的构建的exe中的CompileFile方法,输出转到“临时ASP.NET文件”下的子目录。 但是,当以后点击网站时,IIS会在“临时ASP.NET文件”下的不同子目录下重建控件,使之前的就地编译变得毫无价值。

注意 :在“临时ASP.NET文件”下的就地编译期间创建的程序集将保持不变(仍然存在)。

注意 :就地编译程序集文件夹和IIS生成的程序集文件夹都位于相同的“Temporary ASP.NET Files”目录下。

例:

  • C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 2ba591b9 \ [ 就地编译文件夹名称 ]
  • C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 2ba591b9 \ [ IIS为网站生成程序集 ] \

ClientBuildManagerCompileFile配置

 var buildParameter = new ClientBuildManagerParameter { PrecompilationFlags = PrecompilationFlags.Default, }; var clientBuildManager = new ClientBuildManager( RootVirtualPath, RootPhysicalPath, null, buildParameter); ... clientBuildManager.CompileFile(relativeVirtualPath, callback); 

RootVirtualPath只是默认网站的“”。 RootPhysicalPath指向网站磁盘上的位置。 relativeVirtualPath的格式为“〜/ myFile.aspx”。 回调用于跟踪进度。

我认为你所看到的实际上与使用CompileFilePrecompileApplication无关。 即如果你做同样的事情,但调用PrecompileApplication() ,你仍然会得到一个文件夹不匹配。

请注意,从技术上讲,您没有正确创建CBM对象。 调用它的正确方法是依靠IIS信息来定位文件。 去做这个:

  • 传递/LM/W3SVC/7/ROOT/appVirtualDir
  • appPhysicalSourceDir传递null

请注意,’7’只是一个例子。 要获得正确的数字:

  • 运行inetmgr
  • 转到站点的高级设置
  • 找到站点ID。 这是你想要的数字/LM/W3SVC/ID/ROOT/

我正在为记录解释这个,因为不幸的是,即使以这种方式我也无法使文件夹匹配。 这种情况可能只是在ASP.NET中被破坏了(它曾经工作过!)。

另一种可能性是服务器端。 例如

  • 在您的站点中包含一个页面,用于触发选择性预编译。
  • 在那里,调用BuildManager.GetCompiledType("~/myfile.aspx") ,以及对要预编译的每个页面(或用户控件等)的类似调用。
  • 如果要触发自定义预编译,只需请求该页面

当然,还有一种低技术替代方案,即只需要提前编辑您想要编辑的页面来预热您的网站。

山姆,答案是David Ebbo的回答和原始代码之间的交叉。

 var buildParameter = new ClientBuildManagerParameter { PrecompilationFlags = PrecompilationFlags.Default, }; var clientBuildManager = new ClientBuildManager( RootVirtualPath, RootPhysicalPath, null, buildParameter); ... clientBuildManager.CompileFile(relativeVirtualPath, callback); 

如果您执行David Ebbo所说的内容并在构造ClientBuildManager时将其用于RootVirtualPath:

/LM/W3SVC/7/ROOT/

然后你必须为RootPhysicalPath传入null。

这应该摆脱其余的问题,它应该构建到IIS正在寻找的同一目录。