13

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

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

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

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

注意:就地编译程序集文件夹和 IIS 生成的程序集文件夹都在同一个“临时 ASP.NET 文件”目录下。

例子:

  • 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);

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

4

2 回答 2

12

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

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

  • /LM/W3SVC/7/ROOT/通过类似的东西appVirtualDir
  • appPhysicalSourceDir

请注意,“7”只是一个示例。要获得正确的号码:

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

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

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

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

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

于 2013-03-12T00:57:46.057 回答
3

Sam,答案是 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 正在寻找的同一目录中。

于 2013-03-20T16:42:21.523 回答