使用ClientBuildManager.CompileFile进行就地编译

Sam*_*Sam 13 c# asp.net iis-7 .net-4.0

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

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

当我通过文件编译网站文件时ClientBuildManager.CompileFile在为此目的构建的exe中的方法,输出转到"临时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为网站生成程序集 ] \

ClientBuildManager.CompileFile组态

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

哪里RootVirtualPath是简单的""默认网站. RootPhysicalPath指向网站磁盘上的位置. relativeVirtualPath形式为"〜/ myFile.aspx".回调用于跟踪进度.

Dav*_*bbo 12

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

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

  • 通过类似/LM/W3SVC/7/ROOT/appVirtualDir
  • 传递null为 appPhysicalSourceDir

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

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

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

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

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

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