公司网站时不时会出现"超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小"的错误,我每次的做法是远程去登陆服务器,手动回收iis上的应用程序池,但是感觉挺麻烦的,后来想想能不能用程序操作iis回收应用程序池,于是google了一把,发现还真能这样做,参照了一位老哥写的程序,做了下还真行,在这里记录下来,希望能给有需要的同志带来一些帮助。
using System.DirectoryServices;
protected void RecycleApp_Click(object sender, EventArgs e)
{
string AppPoolName = "DefaultAppPool"; //应用程序池的名称,如“DefaultAppPool”,默认应用程序池
string method = "Recycle"; // 当method="Recycle"时就是回收,为“Start”时是启动,为“Stop”时是停止。
try
{
DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
DirectoryEntry findPool = appPool.Children.Find(AppPoolName, "IIsApplicationPool");
findPool.Invoke(method, null);
appPool.CommitChanges();
appPool.Close();
lbMsg.Text = string.Format("应用程序池{0}{1}成功", AppPoolName, method);
}
catch (Exception ex)
{
lbMsg.Text = string.Format("应用程序池{0}{2}失败:{1}", AppPoolName, ex.Message, method);
}
}
注意:
1. 必须引入System.DirectoryServices.dll
2. 运行此程序的应用程序也的用户必须权限比较高,可以单独为此程序提供应用程序程,或者建立一个虚拟目录在配制里模拟高级用户(如administrators或者system),否则应用程序会抛出“拒绝访问”的异常。
本文首发:程序员俱乐部,转载请保留。