终于发现了一个问题所在
一年前吧,把一个asp.net的应用程序从win2k server搬到win2k3 server上面,运行了一阵子,发生了严重的事件:
某个用户的session会和其他用户交错。一个用户登录后,用了一阵子,突然发现使用者信息已经不是自己的了。这个问题很难重现,不定时地发生。
分析了代码,貌似没问题;修改了session的储存方式,不行。最后觉得实在没办法短期内解决,只好把用户信息通过cookie保存。
以下这篇文章揭示了问题的所在:
会话和输出缓存
Microsoft 后来确认此行为源于 OutputCacheModule 中的问题。(当您阅读本文时,可能已经发布了更新。)当 ASP.NET 与 IIS 6.0 一起使用并且启用内核模式缓存时,OutputCacheModule 有时无法从它传递给 Http.sys 的缓存响应中删除 Set-Cookie 标头。下面是导致出现错误的特定事件顺序:
• 最近没有访问网站(因此也没有对应的会话)的用户请求一个启用了输出缓存的页面,但是其输出当前在缓存中不可用。
• 该请求执行用于访问用户最新创建的会话的代码,从而导致会话 ID Cookie 在响应的 Set-Cookie 标头中返回。
• OutputCacheModule 向 Http.sys 提供输出,但是无法从响应中删除 Set-Cookie 标头。
• Http.sys 在后续的请求中返回缓存响应,误将其他用户连接到会话。
故 事的寓意又是什么呢?会话状态和内核模式输出缓存不能混合使用。如果您在启用输出缓存的页中使用会话状态,并且应用程序在 IIS 6.0 上运行,则您需要关闭内核模式输出缓存。您仍将受益于输出缓存,但是因为内核模式输出缓存比普通输出缓存快得多,所以缓存不会同样有效。有关此问题的详细 信息,请参见 support.microsoft.com/kb/917072。
http://www.microsoft.com/china/msdn/library/webservices/asp.net/WebAppFollies.mspx#E6C
关键字:asp.net session 混乱 cookie 缓存

0 Comments:
Post a Comment
<< Home