这几天自己做着玩一个网站,但是遇到了一个关于session的问题。我使用prototype的Ajax对象来访问页面获取参数,这个参数必须要根据当前的会话的唯一id来确认客户。一般这种需求都会想到SessionId,所以我使用了他。但是我却惊奇得发现,每次使用ajax去请求的时候,SessionId却是变化的!
         这下子郁闷了....这个不会是ajax的问题吧?思前想后,排出了这个可能性。原因:asp.net无法区分http包是来自xmlrequest异步对象还是浏览器的一般请求,asp.net只是得到http包,包的内容并没有标记它是不是异步请求。后来自己做了测试也表明使用一般请求get或者post,都会变化sessionid。好了, 可能是我的思路错了,换个吧。由于我客户端没有禁用cookie,所以我想是不是可以从cookie入手。
         asp.net的Session如果在没有配置为cookieless=true的话,那么在客户端会存储一个sessionid的cookie,
类似于上图。

但是奇怪的是:我竟然没有跟踪到这个cookie,为什么呢???百思不得其解?记得以前看到的文章都说session标记由客户端cookie来维护,asp.net在http包头找到这个cookie后,就能够在进程内找到相应的数据。
但是我的为什么就没有呢?问了几位朋友,也摇头。竟然还有人说我ie有问题,或者是rp有问题,哎....期间找问题解决办法走了不少弯路.....后来,在一次不经意的代码编写中,我的每次访问页面,都把sessionid存入到session中作为一个键值,然后马上取出来返回给客户端。这次竟然sessionid不变!后来我又实验发现,只要你对session这个对象进行过操作,甚至是执行Session.Clear()方法,SessionId就不会变!那么只要在“客户端同一进程内”的发送的请求都会是一个sessionid!!!此时我才感性的认识到:是不是asp.net的session机制就是如果你没有对session对象进行操作,访问的话,那么请求是不是干预session相关对象的,还有这样的好处就是节省了很多服务器的资源,而不需要每次都与session相关的初始化工作(指的是检索cookie中的sessionid,然后构建与当前会话相关的Session对象,供后期httpmodule使用。)
      当然,这个也是我自己对asp.net Session机制的一个感性认识,并没有权威的资料表明,asp.net的Session机制就是这样,欢迎大家讨论,并指正。