一个网站,会设置很多的缓存,来提高网站的访问速度。有数据的缓存,也有页面的缓存。就像本站,数据缓存使用的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的安装介绍
安装下这个,终于大功告成,皆大欢喜
这以后,点一点,就能回收应用程序池了,一劳永逸,好开心,又能节省几分钟,多躺一阵子了