电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

session定义使用和丢失问题小结


发布日期:2023/11/7
 

以前用Session的时候总是拿来就用也没想过先定义再使用今天就换一种方式

SystemWebSessionStateHttpSessionState session = SystemWebHttpContextCurrentSession;//创建Session

sessionAdd(adminTest Session);//Session赋值

sessionTimeout = ;//设置会话超时期限单位为分钟

ResponseWrite(SystemWebHttpContextCurrentSession[admin]ToString());//测试成功

运行立刻可以可以知道结果了否则有时候session的值为null也不知道还老是问为什么session不能传递到下一页面呢?为什么老是丢失呢?

然后在下一页面

protected void Page_Load(object sender EventArgs e)

{

if (Session[admin] == null)

{ ResponseRedirect(loginaspx);

}

}就完成了登陆的session传递了和判断了

当然用完了例如注销登陆则需要

Session[admin] = ;//Session[admin] = null 可理解 Session[admin]根本不存在但=只不过说明他的值是 =

Session Abandon ();

结合我二次开发的blog这里有一点建议如果调试不成功登陆可以考虑在登陆页面中的

if ( Session[admin]== loginok)

{

ResponseRedirect(indexaspx);

}

代码不要因为有可能session重复设置导致混乱不清而出错

我们在用C#开发程序的时候经常会遇到Session很不稳定老是数据丢失下面就是Session数据丢失的解决办法

在WEBCONFIG文件中修改SESSION状态保存模式

<sessionState mode=StateServer stateConnectionString=tcpip=: sqlConnectionString=data source=;Trusted_Connection=yes cookieless=true timeout=/>

说明:WebConfig文件中关于Session的设定如下 sessionState mode=inproc所以要更改

启动系统服务ASPNET状态服务 系统默认是手动启动的

如果SESSION中保存的数据类型是自定义的如结构请在自定义数据类型处序列化会话状态即在类或结构申明前加[Serializable]

完成以上状态即可保存但是在访问页面是浏览器显示的路径中增加了一段字符(S(ltojegcztmqtxevmtb))

SessionState 的Timeout)其主要原因有三种

有些杀病毒软件会去扫描您的WebConfig文件那时Session肯定掉这是微软的说法

二:程序内部里有让Session掉失的代码及服务器内存不足产生的

程序有框架页面和跨域情况

第一种解决办法是:使杀病毒软件屏蔽扫描WebConfig文件(程序运行时自己也不要去编辑它)

第二种是检查代码有无SessionAbandon()之类的

第三种是在Window服务中将ASPNET State Service 启动

又找到一篇文章写是这样的

Session的实现

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

原因

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

原因

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

原因

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

原因

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

原因

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

原因

使用web garden模式且使用了InProc mode作为保存session的方式

解决丢失的经验

判断是不是原因造成的可以在每次刷新页面的时候跟蹤bin中某个文件的修改时间

做Session读写日志每次读写Session都要记录下来并且要记录SessionIDSession值所在页面当前函数函数中的第几次Session操作这样找丢失的原因会方便很多

如果允许的话建议使用state server或sql server保存session这样不容易丢失

在globalasa中加入代码记录Session的创建时间和结束时间超时造成的Session丢失是可以在SessionEnd中记录下来的

如果有些代码中使用客户端脚本如javascript维护Session状态就要尝试调试脚本是不是因为脚本错误引起Session丢失

哪些情况下该进程会重启动呢?微软的一篇文章告诉了我们

配置文件中processModel标签的memoryLimit属性

Globalasax或者nfig文件被更改

Bin文件夹中的Web程序(DLL)被修改

杀毒软件扫描了一nfig文件

更多的信息请参考PRB: Session variables are lost intermittently in ASPNET applications

解决办法

前面说到的sessionState标签中mode属性可以有三个取值除了InProc之外还可以为StateServerSQLServer这两种存Session的方法都是进程外的所以当aspnet_wpexe重起的时候不会影响到Session

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

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

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

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

在使用StateServer或者SQLServer存储Session时所有需要保存到Session的对象除了基本数据类型(默认的数据类型如intstring等)外都必须序列化只需将[Serializable]标签放到要序列化的类前就可以了

[Serializable]

public class MyClass

{

}

总结的不是很有条理还要慢慢消化最要紧是思考结合自己的实际情况检查测试

上一篇:直接把结果输出到打印机

下一篇:通过WMI获得硬盘和CPU的物理序列号