日期:2014-05-17  浏览次数:20757 次

关于web原理的一些问题。请版主赐教
web是基于tcp通讯的,自己写了个简单的web服务端,就是处理浏览器发来的报文,处理静态页面和动态页面,
有个问题不是很明白,session里面的值,是存在服务端的么?如果是的话,每次浏览器接收完消息都会断开tcp连接,再发生其他数据才又连接上,说明session也存在本地吧?否则服务器怎么知道session是否过期呢。


每次关了浏览器,session就失效了,不关的话,tcp也是断开的,对服务器端来说,关不关应该他都可以理解成断开了连接啊。


------解决方案--------------------
引用:
否则服务器怎么知道session是否过期呢。

asp.net根本无法及时知道Session是否过期。它为每一个Session都记录最后访问时间,默认是20分钟,然后每当任意客户端请求到来时都去遍历所有Session、清除超过20分钟的Session集合。

比如说一个很少人访问的网站,对于某一个Session,假设在47分钟之后才有一个客户端访问(不管是这个会话自己的还是别的会话的访问),此Session在这个最后访问47分钟之后就被自动从asp.net进程所占用的内存中自动清除了。

不过其实在商用/租用的服务器上,服务器拥有者为了避免一些垃圾网站影响整个服务器出租,往往设置了IIS回收进程池的时间(例如每当200个访问之后就自动回收、内存占用达到70%时就自动回收、CPU占用超过5%时就自动回收,等等)。因此Session集合其实经常随着进程重启而“丢失”,而根本等不到20分钟/47分钟这么久就自动丢失了。