IIS 重新编译 ASP.NET 网站

3

我和一个朋友谈论了在虚拟目录中放置新文件时IIS的操作。

他告诉我,当你在网站的任何位置放置文件时,IIS会重新编译整个网站,但我认为只有在你放置文件到Bins文件夹中时才会发生(如果发生)。

这次对话是因为公司的一个网站用于上传文件,但文件保存在我们网站的名为“Letters”的文件夹中,我的朋友说每当有人上传文件时,IIS都会重新编译整个网站。他说得对吗?

6个回答

2

只有在添加需要编译的代码时才会重新编译,例如将新类添加到App_Code中。如果仅仅保存图像或文本文件到网站,则不会重新编译。


并不完全正确。有一种叫做即时编译的小东西。只需运行某些代码,就可以导致其重新编译(匿名类型是一个重要例子)。 - NotMe
那么当出现小更改时,最好的方法是什么?需要再次发布整个网站吗?还是有任何巧妙的方法可以从IIS本身重新编译整个网站? - Mitz

2

测试起来很简单。开始观察Web服务器上的JIT编译计数器...浏览一下,然后将文件放入其中以查看计数器的显示。


运行 Perfmon。然后将 .NET CLR Jit 计数器添加到图表中。如果您的应用程序使用匿名类型或匿名方法,它将会跳来跳去。无论如何,在站点重新编译时都会跳动。 - NotMe
好的,我进行了测试,发现当我将文件放入或从我的BIN文件夹中删除时,“%Time in Jit”总是跳动,如果我将文件放入或从其他文件夹中删除,则不会发生任何事情...谢谢。 - jmpena

1

我认为只有当bin程序集、App_Code或global.asax更改时,ASP.NET才会重新启动和重新编译整个站点。

有关优化ASP.NET编译行为的新标志的详细信息,请参见此博客文章

将文件添加到虚拟目录中的文件夹不应导致重新编译(除非该文件夹是“bin”或“app_code”!)


1

在 machine.config 中有一个设置 numRecompilesBeforeApprestart,它表示应用程序重新启动之前可以发生的文件更改次数。默认值为 15。

在非生产环境中,我通常将此设置得更高,这样您就可以在不导致整个应用程序重启的情况下即时修改 aspx 页面。

这可能就是你的朋友所说的内容。


是的,但我可以将图片或文档上传到一个文件夹中,不会发生任何事情吗? - jmpena

0

回收应用程序池。在 PowerShell 中:

$AppPoolName = 'NameOfApp'

$AppPool = Get-ChildItem iis:\apppools | where { $_.Name -eq $AppPoolName}

Restart-WebAppPool $AppPool

这将强制重新编译代码。


重新启动应用程序池似乎不会导致重新编译。 - Jared Beach

0

这绝对取决于你的版本,因为: 还有一个新的热修复程序,可以让您优化编译,使IIS不经常重新编译,但我不确定具体时间。

我认为以前是这样的,如果您没有导航到新的标记文件(而是导航到另一个标记文件),则不会触发重新编译,而bin / dll / assembly文件始终会触发重新编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接