在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端)。客户端与服务器端就是通过这个key来确认客户端的身份,通常这个key为SessionID。 一般情况下,SessionID以Cookie的形式保存在浏览器中,在不使用Cookie的情况下,也可以将这个SessionID嵌入到访问网页的URL中。 二、服务器端Session在页面对象或者HttpContext对象中,都有一个名为Session的属性,在一次会话中,它们引用的都是同一个对象。 public HttpSessionState Session { get; }
Session对象是HttpSessionState类的实例。Session是保存在服务器端的,对每个登录到网站的用户都有一份,是独有的,而其他用户无法共享。 HttpSessionState来自于HttpModule的SessionStateModule。在每次请求处理过程中,HttpApplication的请求的处理管道中会检查当前请求的处理程序是否实现了接口IRequiresSessionState,如果实现的话,那么SessionStateModule将为这个请求分配HttpSessionState。同时SessionStateModule还负责SessionID的生成、Cookieless会话管理、从外部状态提供程序中检索会话数据以及将数据绑定到请求的调用上下文。
SessionStateModule模块从特定状态提供程序中读取数据。在程序代码中实际上访问的是会话数据在本地内存中的副本,如果其他页面也视图同步访问该会话状态就可能会导致数据冲突。为了避免这种情况,SessionStateModule模块实现了一个读取器/写入器的锁定机制,并对状态值的访问进行排队。对会话状态具有写入权限的页面将保留该会话的写入器锁定,直到请求终止。 如果页面请求设置一个读取器锁定,同一会话中同时处理的其他请求将无法更新会话状态,但是至少可以进行读取。如果页面请求为会话状态设置一个写入锁,那么所有其他页面都被阻止,无论他们是否要读取或写入内容。例如,如果同时有两段程序视图在同一个Session中写入内容,一段程序必须等到另一段程序完成后才能写入。在AJAX程序设计中,必须注意这种情况的发生。 网上查了一下 基本上的解决方案 如下 对于Asp.net MVC:可以为本Controller增加以下特性,但是本Controller都不能修改Session了,只能读取 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 对于Asp.net WebForm:在Web.config 文件里面添加EnableSessionState="ReadOnly" // 仅仅加载那个阻塞页面 经过测试上面的方法并未有卵用 已将session 改为 System.Web.Caching.Cach 或者 Redis 或者 memcached来实现 大概实现逻辑就是 自己生成一个key 这个key可以是用户Id 然后 通过cookie的方式写到客户端 每次客户端访问服务器都携带这个cooike 就可以实现自己的会话变量了 其主要目的是为个规避session锁的问题 尤其是页面使用了进度条的 .... 特此笔记记录
|
请发表评论