通过程序控制IIS停止并删除站点
最近项目里需要在一个网站里对另一个网站停用并移除网站对应目录。
1.停止站点
最开始只是这么做:
1 Microsoft.Web.Administration.ServerManager iisManager = new Microsoft.Web.Administration.ServerManager(); 2 iisManager.Sites[WebSite].Stop(); 3 Delete(WebSiteFolder);
停用站点后去删除站点对应目录,但是很多时候删除不了,下载了一个进程查看工具,发现站点对应目录被IIS的w3wp进程占用。
如何把这个进程杀掉呢?
2.独立的应用程序池
首先需要为这个站点建立一个独有的应用程序池。为什么是独有的呢?
这里需要明确一些概念,一个应用程序池可以包含多个应用程序,而一个应用程序池对应一个w3wp进程。所以为了在杀掉这个应用程序对应的w3wp进程的同时不影响其他的应用程序,就需要给这个站点建立单独的应用程序池了。
建好之后,我们需要在停止站点时,停止它的应用程序池,于是代码变成了这样:
1 Microsoft.Web.Administration.ServerManager iisManager = new Microsoft.Web.Administration.ServerManager(); 2 iisManager.Sites[WebSite].Stop(); 3 iisManager.ApplicationPools[ApplicationPoolName].Stop(); 4 Delete(WebSiteFolder);
但是经过测试发现,站点和应用程序池都停止了,但是对应的w3wp进程还在,这又是怎么回事呢?
w3wp进程不会在关闭了应用程序后就马上关闭,是因为http是无连接的访问,当我们关闭了web网页,不会返回相应的关闭信息,所以w3wp进程不会因为关闭了web应用程序而立即关闭。
3.应用程序池的配置
那么如何解决这个问题呢?我们可以通过配置应用程序池来解决。
右键点击对应的应用程序池,点击“高级设置”,打开设置窗口,IIS7下有六部分:
1.(常规)
2.CPU
3.回收
4.进程孤立
5.进程模型
6.快速故障防护
这里我们主要关注进程模型里的相应设置,重点看“关闭时间限制(秒)”和“闲置超时(分钟)”。
闲置超时是指当工作进程空闲多少分钟后关闭此工作进程,默认是20分钟。将其修改为0,经过测试发现w3wp进程还是没有立刻被杀掉。
再看“关闭时间限制(秒)”,它是指当IIS检测到某个工作进程出现故障时,IIS等待工作进程自动关闭的时间限制,如果超出此时间限制后工作进程尚未关闭,则IIS强行关闭工作进程。它的设置范围是1到4294967秒。
将其修改为最小值1,经过测试后发现,当站点和应用程序池停止后,w3wp进程随即被关闭了。大功告成!
参考资料:
http://support.chinaccnet.com/archives/8072.html 认识w3wp.exe进程
http://www.cnblogs.com/qqflying/archive/2010/08/18/1802644.html 应用程序池的配置