我和一个朋友谈论了在虚拟目录中放置新文件时IIS的操作。
他告诉我,当你在网站的任何位置放置文件时,IIS会重新编译整个网站,但我认为只有在你放置文件到Bins文件夹中时才会发生(如果发生)。
这次对话是因为公司的一个网站用于上传文件,但文件保存在我们网站的名为“Letters”的文件夹中,我的朋友说每当有人上传文件时,IIS都会重新编译整个网站。他说得对吗?
我和一个朋友谈论了在虚拟目录中放置新文件时IIS的操作。
他告诉我,当你在网站的任何位置放置文件时,IIS会重新编译整个网站,但我认为只有在你放置文件到Bins文件夹中时才会发生(如果发生)。
这次对话是因为公司的一个网站用于上传文件,但文件保存在我们网站的名为“Letters”的文件夹中,我的朋友说每当有人上传文件时,IIS都会重新编译整个网站。他说得对吗?
只有在添加需要编译的代码时才会重新编译,例如将新类添加到App_Code中。如果仅仅保存图像或文本文件到网站,则不会重新编译。
测试起来很简单。开始观察Web服务器上的JIT编译计数器...浏览一下,然后将文件放入其中以查看计数器的显示。
我认为只有当bin程序集、App_Code或global.asax更改时,ASP.NET才会重新启动和重新编译整个站点。
有关优化ASP.NET编译行为的新标志的详细信息,请参见此博客文章。
将文件添加到虚拟目录中的文件夹不应导致重新编译(除非该文件夹是“bin”或“app_code”!)
在 machine.config 中有一个设置 numRecompilesBeforeApprestart,它表示应用程序重新启动之前可以发生的文件更改次数。默认值为 15。
在非生产环境中,我通常将此设置得更高,这样您就可以在不导致整个应用程序重启的情况下即时修改 aspx 页面。
这可能就是你的朋友所说的内容。
回收应用程序池。在 PowerShell 中:
$AppPoolName = 'NameOfApp'
$AppPool = Get-ChildItem iis:\apppools | where { $_.Name -eq $AppPoolName}
Restart-WebAppPool $AppPool
这将强制重新编译代码。
这绝对取决于你的版本,因为: 还有一个新的热修复程序,可以让您优化编译,使IIS不经常重新编译,但我不确定具体时间。
我认为以前是这样的,如果您没有导航到新的标记文件(而是导航到另一个标记文件),则不会触发重新编译,而bin / dll / assembly文件始终会触发重新编译。