Session莫名丢失的原因及解决办法[转载]

Asp.net 默认配置下,Session莫名丢失的原因及解决办法
正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。

这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。


原因:
由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:
前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。

这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
    ......
}
具体的序列化相关的知识请参这里。

至此,问题解决。
关于asp.net Session丢失问题的总结
asp中Session的工作原理:
asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

asp.net Session的实现
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。

原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式

解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失

转载于:https://www.cnblogs.com/chaobaojun/archive/2009/09/17/1568313.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python的构造函数和析构函数,对象和类的不一样

1.Python像其他的OOP语言一样在类里面会有构造和析构函数... 类似于PHP的, 构造和析构函数并不需要显式的写出来...他们只是在这个对象生成和销毁的时候才会被调用.. 如果显式的定义了,那么在对象被生成和销毁时就会分别的调用这两个函数 构造函数: __init__ 这个函数在用代码生…

Android控件捕获点击事件的范围

View的Tween动画过程中点击事件的位置并不会因为动画位置的改变而改变&#xff0c;是因为在动画过程中layout的位置实际上没有变&#xff0c;因此曾经一度认为View的点击事件&#xff08;其实不仅仅是点击事件&#xff0c;包括所有的触摸事件&#xff09;触发的范围是该View在l…

利用闭包实现onclick事件传递参数

当触发点击事件&#xff0c;一个简单的例子。 <!DOCTYPE html> <html> <head><title>闭包创建数组</title><meta charset"utf-8"><script type"text/javascript">window.onload function (){var lis documen…

ms sql 触发器( 转)

create trigger TgNameon tbfor updateas if update(recommend)begin update tb set commenddate(getdate()) from tb inner join inserted on tb.vlistidInserted.vlistidend关键在于Inserted表触发器语句中使用了两种特殊的表&#xff1a;deleted 表和 inserted 表。Dele…

Sicily 1034. Forest

题目地址&#xff1a;1034. Forest 思路&#xff1a; 网上很多说用深搜&#xff0c;很任性.......发现广搜也挺好用的&#xff0c;实验课打的(⊙o⊙)…orz........囧。 先找根结点&#xff0c;根据根结点广搜深度&#xff0c;广搜宽度&#xff0c;不过要开一个数组&#xff0c;…

Python中文全攻略

From: http://www.sqlite.com.cn/MySqlite/11/395.Html 1. 在Python中使用中文 在Python中有两种默认的字符串&#xff1a;str和unicode。在Python中一定要注意区分“Unicode字符串”和“unicode对象”的区别。后面所有的“unicode字符串”指的都是python里的“unicode…

HTTP 304状态码的详细讲解

HTTP 304状态码的详细讲解 304状态码或许不应该认为是一种错误&#xff0c;而是对客户端有缓存情况下服务端的一种响应。 整个请求响应过程如下&#xff1a; 客户端在请求一个文件的时候&#xff0c;发现自己缓存的文件有 Last Modified &#xff0c;那么在请求中会包含 If …

[MySQL FAQ]系列 -- 数据不算大,备份却非常慢

作/译者&#xff1a;叶金荣&#xff08;Email: &#xff09;&#xff0c;来源&#xff1a;http://imysql.cn&#xff0c;转载请注明作/译者和出处&#xff0c;并且不能用于商业用途&#xff0c;违者必究。问题环境硬件&#xff1a;DELL 1950, 146G SAS 15K RPMS * 2, 8G Ram软件…

视频编解码:第一章 编解码基础

1. 视频编码概念 视频编码方式就是指通过特定的压缩技术&#xff0c;将某个视频格式的文件转换成另一种视频格式文件的方式。 2. 为什么要进行视频压缩&#xff1f; 数据太大&#xff1a;未经压缩的数字视频数据量巨大存储困难&#xff1a;一张DVD只能存储几秒钟的未压缩数字视…

[python]删除列表中相同的元素

去除列表中重复的元素&#xff0c;非常简单&#xff0c;直接上代码&#xff1a; a [11, 21, 3, 4, 3, 2, 5] b list(set(a)) print(a) print(b)运行结果&#xff1a; E:\Program\Python>d.py [11, 21, 3, 4, 3, 2, 5] [2, 3, 4, 5, 11, 21]看到了吗&#xff0c;结果中确实…

js-cookie使用方法

该插件解决了原生js操作cookie的麻烦 js-cookie使用方法 js-cookie用来处理cookie相关的插件&#xff0c;非常简单好用&#xff0c;下面简单记录一下&#xff1a;1、项目中引用&#xff1a; npm install --save js-cookie2、js-cookie的使用&#xff1a; 安装好js-cookie插…

WindowsXP命令行修改服务启动选项

1、修改服务启动类型&#xff1b;使用命令sc&#xff0c;命令使用方法见下例&#xff1a;sc config messenger displayname "messenger" start auto说明&#xff1a;messenger:所要操作的服务名称displayname "messenger":所要操作的服务名称显示出来的名称…

Python 文件读和写

转载于:https://www.cnblogs.com/nzyjlr/p/4157582.html

element-ui 设置菜单栏展开

element-ui 侧边栏默认要全部展开怎么做&#xff1f; element-ui文档中是这么写的 default-openeds 当前打开的sub-menu的key数组 给标签加上这个属性 <el-menu class"el-menu-vertical" open"handleOpen" close"handleClose" theme"…

删除列表中满足一定条件的元素

从列表中删除满足一定条件的元素。 如&#xff1a;删除一个列表中长度为0的元素&#xff0c;或者删除列表中同时是2和3的倍数的元素。 做过高级语言编程的人想当然的会认为“这很简单”&#xff0c;可以如下面的方式来实现&#xff1a; for i in listObj:if(...):listObj.rem…

简单JS实现走马灯效果的文字(无需jQuery)

效果类似&#xff1a;(抱歉&#xff0c;图片是静态的) 写一段html&#xff0c;需要走马灯上下跳动的内容&#xff0c;但每次只显示一行&#xff1a;<hr size"0" align"center" style"border-top: 1px solid #F5F5F5;"/> <div id"m…

Android Service 生命周期

Android Service的生命周期 Managing the Lifecycle of a Service service的生命周期&#xff0c;从它被创建开始&#xff0c;到它被销毁为止&#xff0c;可以有两条不同的路径&#xff1a; A started service 被开启的service通过其他组件调用 startService()被创建。 这种ser…