Wednesday, August 01, 2007

终于发现了一个问题所在

年前一个asp.net应用程序win2k serverwin2k3 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