使用代码回收IIS应用程序池

一个网站,会设置很多的缓存,来提高网站的访问速度。有数据的缓存,也有页面的缓存。就像本站,数据缓存使用的Memcached,页面缓存呢,就是使用的ASP.NET自己的缓存策略,缓存在应用程序池里的。

数据缓存的策略,倒是很好配置,修改后,都可以触发相应的操作,去更新缓存。但是页面缓存,策略比较极端,非黑即白,要么存在,要么清理掉。

有时候改点东西,无法立刻看到效果,都得远程登录服务器,然后回收一下应用程序池。一次两次还行,次数多了,就觉得麻烦了,那就用代码来简化吧。

public bool RecycleAppPool()
{
    string AppPoolName = "TestAppPoool";
    string method = "Recycle";
    //当method = "Recycle"时就是回收,为“Start”时是启动,为“Stop”时是停止。

    try
    {
        //需要引入System.DirectoryServices.dll
        System.DirectoryServices.DirectoryEntry appPool = new System.DirectoryServices.DirectoryEntry("IIS://localhost/W3SVC/AppPools");
        System.DirectoryServices.DirectoryEntry findPool = appPool.Children.Find(AppPoolName, "IIsApplicationPool");
        findPool.Invoke(method, null);
        appPool.CommitChanges();
        appPool.Close();

        Log(string.Format("应用程序池{0},{1}成功", AppPoolName, method));
        return true;
    }
    catch (Exception ex)
    {
        Log(string.Format("应用程序池{0},{2}失败:{1}", AppPoolName, ex.Message, method));
        return false;
    }
}


想法是好的,现实是残酷的,抛异常了,拒绝访问。经过排查,是权限的问题,找到了两个解决办法

第一种:在Web.config的<configuration>里加上以下代码

<system.web>
    <identity impersonate="true" userName="username" password="password"/>
</system.web>

第二种:在IIS里->找到应用程序池->选择高级设置->将ApplicationPoolIdentity修改为LocalSystem,如图所示

   

我想应该还有别的方法,但是我只实践了这两种,并且都是OK的,然后我选了第二种


本地测试一切正常,可是上线后,发现自己还是图样图森破,日志里报了一个异常,未知错误(0x80005000)

然后查了一下资料,也找到了解决办法,图片分别是Win7系统和Windows Server 2008的安装介绍

26012455104923631.jpg26012445635765122.jpg

安装下这个,终于大功告成,皆大欢喜


这以后,点一点,就能回收应用程序池了,一劳永逸,好开心,又能节省几分钟,多躺一阵子了