ASP.net C#在将新的DLL复制到BIN目录时需要重新启动IIS

8
我们遇到了一个问题,每次将dll复制到bin目录时,我们网站上的主域名就会停止运行,唯一恢复的方法是重新启动“WWW发布服务”。
我们运行一个包含多个IIS应用程序的网站,这些应用程序在单个服务器上运行,其中每个应用程序都配置为在不同的应用程序池中运行。
我们有一个大型代码库,其中包含超过280个aspx页面。我们的主域名包含约100个aspx页面,而子域名则每个包含15或20个。
当我们进行构建时,我们当前正在生成一堆dll,然后手动将它们复制到生产服务器的bin目录中。一旦我们这样做,IIS显然会启动回收编译每个aspx页面和代码behind。此时,网站基本上会停滞不前(有时需要重新启动Web发布服务才能唤醒它)。
奇怪的是,只有在部署到主域名IIS应用程序时才会发生这种情况,即www。如果我们以同样的方式向子域名部署一个bin文件,它几乎立即就可以工作。
即使我执行iisreset.exe,这似乎也无法解决问题。
一些规格:
- 代码使用:C# - .net框架:2.0 - 服务器:Windows Web Server 2008 - iis版本:IIS7 - 数据库:MSSQL 2008 Standard
请帮忙回答以下几个问题:
1. 是否有任何方法可以加快当前的过程,以便我们不必重新启动服务器? 2. 是否有任何明显的代码更改或更新需要重启服务(有时我们运行iisreset,但这似乎无法使其恢复正常)?
谢谢您提前的帮助。
3个回答

14
当你将一个名为app_offline.htm的文件放置在主域(wwwroot)中时,IIS站点将会下线。这是IIS的默认行为,正如Scott Gu所描述的那样。当你这样做时,所有的dll文件都可以安全地被覆盖。当你删除app_offline.htm文件后,下次请求到来时,应用程序将会启动。
关于app_offline.htm的更多信息可以在这里这里阅读。
基本上,如果你在Web应用程序目录的根目录中放置了这个名字的文件,ASP.NET 2.0会关闭该应用程序、从服务器卸载应用程序域,并停止处理该应用程序的任何新传入请求。 ASP.NET还会响应该应用程序的所有动态页面请求,发送回app_offline.htm文件的内容(例如:你可能想要一个“网站正在建设中”或“维护中”的消息)。
这提供了一种方便的方法,在进行大型更改或复制大量新页面功能时,将应用程序下线(并避免人们在内容更新过程中访问和激活你的网站的烦人问题)。 这也可以是一种有用的方式,立即解锁和卸载SQL Express或Access数据库,其.mdf或.mdb数据文件位于/app_data目录中。
一旦你删除app_offline.htm文件,下一个进入应用程序的请求将会导致ASP.NET重新加载应用程序和应用程序域,生活将继续正常进行。

那么主要问题是由于锁定导致DDL未被释放,因此我们无论如何都需要重新启动服务才能使服务器恢复正常吗? - StacMan
这可能是问题所在。但在IIS中更新Web应用程序的正确方法是首先将app_offline.htm放在根目录中,然后更新站点以避免锁定和其他类似的问题。当您使用app_offline.htm时,不需要进行iisreset操作。当您使用vs2010与tfs2010并获取最新版本vs2010时,vs2010也会将app_offline.htm放在您的根目录中,并在检索所有文件后将其删除,请参见此问题https://dev59.com/J2865IYBdhLWcg3wIrFg。 - Wessel Kranenborg
谢谢,我很感激你的帮助。虽然你的建议有助于提高可用性,但我仍然想弄清楚为什么需要重新启动以及可能导致问题的原因。 - StacMan

3
据我所知,当您将dll添加到bin文件夹时,不需要执行iisreset操作。该dll应该会自动从bin中加载。
当您将新的dll添加到全局程序集缓存时,应该执行iisreset操作。

2
这是一种选择,但更安全的做法是在您的根目录中设置一个app_offline.htm,然后复制dll文件,以便释放所有可能存在的锁定。 - Wessel Kranenborg
iisreset 在托管多个站点的服务器上并不适用,特别是你只更改了其中一个站点时。 - Jesse Buchanan
@JesseBuchanan 如果iisreset无法生效,有时可以尝试定向应用程序池回收。 - mlhDev

0

在复制dll文件时,您能否停止IIS中的网站,然后再重新启动它?因为这样不会影响托管在同一IIS中的其他网站。


我们尝试了几次,但没有帮助。无论如何,它并不能实现我们正在寻找的目标(即解释为什么部署到www需要重新启动,而子域需要几秒钟来回收)。 - StacMan

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