【问题标题】:ASP.NET in-place precompile doesn’t work as expectedASP.NET 就地预编译无法按预期工作
【发布时间】:2014-03-27 17:22:36
【问题描述】:

我正在尝试使用 ASP.NET 预编译工具 aspnet_compiler.exe 在站点部署后对其进行编译。

根据书籍定义,在 Web 机器上运行就地预编译应该会改善首页加载体验。编译工具编译每个 ASP.NET 页面,将编译后的版本存储在 %WINDIR%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 文件夹中,就像每个页面都是第一次从浏览器访问一样。就地预编译可以加快向您网站上新部署的 ASP.NET 页面发出的第一个请求,因为它减少了运行时执行此步骤的需要。

出于某种原因,它无法按预期的方式工作。

当手动在 Web 机器上本地运行 aspnet_compiler.exe 时:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /7.1 -p C:\MyPathToWebSite\www

它创建了以下结构结构的文件夹:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\7.1\640c1f87\4be3507b

当我尝试使用浏览器访问网页时,ASP.NET 在同一服务器上的以下文件夹中创建另一个缓存版本:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\7.1\bc8a1bb3\42b014d4

正如您所见,预编译在两种情况下(手动和 IIS)都有效,但不知何故,IIS 看不到页面已经预编译和兑现,并试图再次重新编译所有内容。我无法弄清楚缺少什么或做错了什么,因为 aspnet_compiler.exe 用于就地编译的参数选项有限。

到目前为止,我在测试/调查 ASP.NET 临时缓存方面尝试了以下操作:

  • 似乎与用户无关,与手动运行的用户无关
  • 与源/目标 IP 无关,因为相同的文件夹是在不同子网的不同服务器上创建的

任何想法和帮助表示赞赏。

【问题讨论】:

    标签: asp.net aspnet-compiler pre-compilation


    【解决方案1】:

    我遇到了同样的问题。只有使用我网站的元数据库路径才能解决它。

    aspnet_compiler.exe -m /LM/W3SVC/[site ID]/root
    

    【讨论】:

      【解决方案2】:

      您在第一个文件夹中看到的文件没有经过 jitted。您只需将您的网站编译为 MSIL,当您第一次访问某个页面时,它会被编译为本机图像代码 - 这些是您在第二个文件夹中看到的文件。 您可能想使用 Ngen - http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx

      【讨论】:

      • 感谢您的回复。在这种情况下,这破坏了预编译器的目的/目标,它假设创建本机代码。特别是当您在机器本身上运行就地编译时?
      • 编译并不一定意味着代码被编译为本机代码。在 .NET(和 java,例如)中有两个编译阶段 - 第一个是从源代码到 MSIL,第二个是从 MSIL 到本机。预编译只指第一阶段,而 Ngen 将你的源代码直接编译为原生(我对 Ngen 不太熟悉,但我猜有一些编译级别)。
      猜你喜欢
      • 2020-05-01
      • 1970-01-01
      • 2015-03-22
      • 2016-12-22
      • 2021-10-07
      • 1970-01-01
      • 2013-12-23
      • 2014-12-09
      相关资源
      最近更新 更多