(本帖在版工的旧 Blog 中,发表日期为 2007/09/27)
版工之前有一个 ASP.NET 2.0 的 project,在使用者经过 Login 控件登入后,会将登入信息写到 Session 中,并在每一页中判断,若该 Session 为 null 时 (使用者闲置过久),则强制「注销 (Logout)」并导回登入页面。但日前却发现,不论版工将该网站 Web.config 的 HttpSessionState.Timeout 属性、FormsAuthenticationConfiguration.Timeout 属性,数值不论设得多大,使用者都在闲置尚未达到设定时间,即自动被系统踢出。后来才发现问题是出在 IIS 6.0 其「应用程序集区 (Application Pool)」的一个默认值,该默认值会让使用者在闲置超过 20 分钟后,即会被关闭掉相关的「进程 (Process)」。
当时版工 ASP.NET 2.0 网站的 Web.config,关键设定如下:
上方的设定,有两个 timeout 属性。前者表示使用者登入后,验证到期之前的可闲置时间 (以分钟为单位),默认值为 30 分钟,我改成 60 分钟;后者表示使用者浏览器的 Session,在系统中可闲置的时间,默认值为 20 分钟,我改成 70 分钟。
后来版工发现,使用者实际上只能闲置 30 分钟左右,若闲置到 40 分钟,即会引发 Session 遗失 (null);并因为该网站在各页中,我都加入了下方的 C# 代码,因而造成使用者在 Session = null 时,会被系统自动踢出。
版工后来发现,问题是出在 IIS 6.0 的「应用程序集区」默认值 (简体中文版 IIS 名称可能不同)。当我们在 IIS 中新增一个「网站」或「虚拟目录」时,在其「主目录」或「虚拟目录」页签中,预设的「应用程序集区」会选用「DefaultAppPool」,如下图 1 所示。
图 1
我们再回到 IIS 上方,展开左侧树状选单中的「应用程序集区」活页夹,在「DefaultAppPool」节点上按鼠标右键,选择「内容」,再点选上方第二个页签「效能」(简体中文版,可能是翻译成「性能」),将「闲置等候时间」,从默认的 20 分钟,改成 70 分钟,或改成您希望使用该「集区」的所有应用程序,其使用者可闲置的最大时间,如下图 2 所示。
图 2
设定完成后,记得重新启动 IIS。做法为 Windows「开始」菜单 →「执行」,输入「iisreset」,再按 Enter 键。
做完上述动作后,您的 ASP.NET 2.0 网站才会正常按照您在 Web.config 中设定的 timeout 值,强制卸除使用者的 Session,或强制注销系统。例如依照本帖一开始在 Web.config 中设定的两个 timeout 值,使用者会在闲置了 60 多分钟后 (Session 还在),若又执行了某个动作 (例如写入数据库),则会先正常执行该动作,再强制使用者注销系统;若闲置了 70 分钟以上,则使用者浏览器的 Session 即会遗失。以上几种情形,皆经过版工实际测试过。
总结上述观念,是因为 IIS 6 的「应用程序集区」的「闲置等候时间」(参考上图 2),是指 Web 应用程序 (ASP.NET) 资源多久没有被人使用时,就进行系统资源回收。若我们在开发 project 期间,因为多半是单一个使用者,在单一主机上测试,所以「应用程序集区」的「闲置等候时间」若小于 Web.config 的 Session timeout 设定值,就会以「应用程序集区」的「闲置等候时间」设定时间来回收资源;不过若系统正式上线后,在多人使用的 Web 环境下,比较不会发生此种情形。
另根据网友所述,若有 ASP.NET 1.x 和 ASP.NET 2.0 的网站系统,共享同一个「应用程序集区」,也可能产生无法预期的现象。并建议若有此种混用情形时,最好是在 IIS 中再开一个新的应用程序集区,以避免共享的情形。
IIS 6.0 的「应用程序集区」,是让应用程序或不同版本的组件,能在单一 server 上有效地隔离、增进性能与增进稳定性的技术。若有兴趣深入研究的网友,可用「IIS "应用程序集区"」关键词自行至搜寻引擎查询,或参考 MSDN Library 及下列文件:
ps. 以下有的文件或 hyperlink,内地网络可能无法开启。
IIS 6.0 与 ASP .NET 应用程序设计技巧:
http://www.msservermag.com.tw/win2003/article/M050103401.pdf
http://download.microsoft.com/download/5/c/1/5c18131d-a927-4441-8df0-c67ad90fa2e9/IIS%206.0_ASP_NET_AP_Skill.ppt
Web应用程序与IIS 6.0整合技术探讨:
http://download.microsoft.com/download/7/9/e/79ebf23a-9191-4583-88d2-13c4ba93eb8f/Web%20Application%20and%20IIS%206.ppt
IIS 6.0 操作手册 (台湾的 msdn):
http://technet2.microsoft.com/WindowsServer/zh-CHT/Library/cf8e2317-a440-4e72-b0e4-264d92ba8f8f1028.mspx?mfr=true
IIS 6.0 Documentation:
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/848968f3-baa0-46f9-b1e6-ef81dd09b015.mspx?mfr=true