asp.net

在C#中,在Web.Config文件中加入sessionState mode="InProc"语句

2010-08-07

在Web.Config文件中加入<sessionState mode="InProc"></sessionState>语句,但 是在关闭IE页面时好像并未触发Session_End事件。我实验了一个用于记录来访人数 的小网页程序,使用了Application["visitor_counter"]变量。首先修改Web.config 文件,将上面的<session...>语句加入其<Configuration><system.web>下。然后在 Session_Start事件中使用如下语句: Application.Lock(); Application["visitor_counter"]=(int)Application["visitor_counter"]+1; Application.UnLock(); 在Session_End事件中使用如下语句: Application.Lock(); Application["visitor_counter"]=(int)Application["visitor_counter"]-1; Application.UnLock(); 最后在default.asp中加入了一个Label元素,将Application["visitor_counter"]信 息以字符串格式输出。 结果是每打开一次网页,Application["visitor_counter"]值就增1,但是关闭网页 并未是其减少1。请问这是怎么回事,如何解决。

 

回答:

除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。 怎么解决呢? 由于关闭浏览器不会导致session被删除,所以服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。 大概是你关闭及统计需要一定的时间反应,刷新几下是不是减1了? 要是还没有,那你通知我,让我想想是怎么回事