Session 失效

cjlxm1 2008-09-01 04:15:02
有类:
namespace Asset.BaseInfo
{
public class PageArchitecture :Page
{
public PageArchitecture()
{
}
//ADID
public string LoginUser
{
get
{
return this.Context.User.Identity.Name;
}
}
//雇员号
public string EmpNo
{
get
{
string LoginEmpno = "";
if (HttpContext.Current.Session["LoginEmpno"] == null) //保存登录者 其中loginempno是login.aspx里面登录成功时,记录的
{
HttpContext.Current.Response.Redirect("/btsl/asset/asset/Login.aspx");
}
else
{
LoginEmpno = HttpContext.Current.Session["LoginEmpno"].ToString();
}
return LoginEmpno;
}
public void SetNoCache()
{
this.Response.CacheControl = "no-cache";
this.Response.AddHeader("Pragma", "no-cache");
this.Response.Expires = -1;
}

}

public class basePage : PageArchitecture
{
protected override void OnLoad(EventArgs e)
{
this.Response.Buffer = true;
this.SetNoCache();
RegistExecScript(); // 不知是不是跟这些有关,代码是别人写的,有点看不懂,所以一并贴出来了。
RegisterForbidden();
base.OnLoad(e);
}
public void RegistExecScript()
{
StringBuilder script = new StringBuilder();
script.AppendFormat("{0}\r\n", @" <script language='javascript'> <!--");
script.AppendFormat("{0}\r\n", @" function exec(stat)");
script.AppendFormat("{0}\r\n", @" {");
script.AppendFormat("{0}\r\n", @" if(document.readyState==""readyState"" || document.readyState==""complete"")");
script.AppendFormat("{0}\r\n", @" {");
script.AppendFormat("{0}\r\n", @" setTimeout(stat,0);");
script.AppendFormat("{0}\r\n", @" clearTimeout();");
script.AppendFormat("{0}\r\n", @" }else{");
script.AppendFormat("{0}\r\n", @" setTimeout(""exec(\""""+stat+""\"")"",500);");
script.AppendFormat("{0}\r\n", @" }");
script.AppendFormat("{0}\r\n", @" }");
script.AppendFormat("{0}\r\n", @" --></script>");
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(),"exec", script.ToString());
}
public void RegisterForbidden()
{
StringBuilder script = new StringBuilder();
script.AppendFormat("{0}\r\n", @" <script language='javascript'> <!--");
script.AppendFormat("{0}\r\n", @" document.oncontextmenu=new Function(""return true;"");");
script.AppendFormat("{0}\r\n", @" document.onkeydown=new Function(""if(event.keyCode==8){return true;} if(event.keyCode==78 && event.ctrlKey){return false;} if( (event.keyCode==37 || event.keyCode==39) && event.altKey){return false;}return true;"");");
script.AppendFormat("{0}\r\n", @" --></script>");
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(),"forbidden", script.ToString());
}
}
}

页面B0001 .cs
public partial class B0001 : basePage
{
...
取登录者的时候就用:
string loginempno=Empno;
现经常取不到Empno,有时候过不了两分钟就要求重新登录。。。
}

另 webconfig内:
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="180" />

以上就是主要代码,由于是别人写的有点看不明白所以一并贴上。
现问题是:Session失效不对,设置的3个小时,但有时就几分钟要求用户重新登录。
...全文
611 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
zds1010 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzyhuian06142 的回复:]
"Session失效不对,设置的3个小时,但有时就几分钟要求用户重新登录。 "
改下 WebConfig
[/Quote]
ye0804 2008-09-08
  • 打赏
  • 举报
回复
顶起
cjlxm1 2008-09-04
  • 打赏
  • 举报
回复
加了,还是报错:
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。
cjlxm1 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 zhnzzy 的回复:]
你在页面的CS文件头再加上呢?
[/Quote]
我在类PageArchitecture上加的。

那我再在页面的cs文件头加上,试试。
skywolfY 2008-09-04
  • 打赏
  • 举报
回复
hcooTmp.Expires = DateTime.Now.AddSeconds(200); 设的是200。如果你这时间内不动,并且过了timeout,就会跳到登录页。
另外,在开发环境中,用程序运行和用IE运行同一页面是有分别的。
要试的话,得编译成网站后,设置好timeout再做同样事情。

还有如果你在200内,另开IE再开一网站页面,同样会得到session,这就是不安全因素。所以,在用这种方法之后,最好配合使用 Server.Transfer("")方法跳转页面,以加强全安性。
我写的代码的主要作用是在iis重启、webconfig被改等等这种突发性 session失丢的情况下,使session能从cookie读取。时间根据安全要求设置,毕竟,cookie保存这些敏感信息是不安全的。
25楼的方法在多数时好用,不过也不用不了的时候。iis很稳定,但不是很稳健。

zhnzzy 2008-09-04
  • 打赏
  • 举报
回复
你在页面的CS文件头再加上呢?
zhnzzy 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 cjlxm1 的回复:]
另外: [Serializable()]用了这个,是不是该类不能继承啦。
[/Quote]

不是呀,还有错吗?
cjlxm1 2008-09-04
  • 打赏
  • 举报
回复
各位,怎么解决的啦。
ZKM_ZHANG 2008-09-04
  • 打赏
  • 举报
回复
以前也遇到类似的问题。
cjlxm1 2008-09-04
  • 打赏
  • 举报
回复
过了二十来分钟,再进去的时候,
点“添加”,居然没反应,但打开其它页面又可以。
cjlxm1 2008-09-04
  • 打赏
  • 举报
回复
代码里没有清除session,我已查过。
但session多处用到。
hecong875 2008-09-04
  • 打赏
  • 举报
回复
已经也遇见过这样的问题!


Session本身就不太稳定! 但是你最好在仔细检查下你的代码!  有可能是代码那里写的有问题! 倒置Session不稳定...... 失效!
cjlxm1 2008-09-04
  • 打赏
  • 举报
回复
哎,代码里有session存放datatable的,刚去掉就没错误了。
但session能不能起到作用还是未知。

请问一下:[Serializable()]和存放datatable的session不能一起用吗?
能有什么办法解决吗?
cjlxm1 2008-09-03
  • 打赏
  • 举报
回复
[Serializable] 放在要序列化的类前。
请问那些类属于要序列化:
basepage 还是 具体的画面类如以上的B0001
cjlxm1 2008-09-03
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 zhnzzy 的回复:]
现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。

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

除此之外,我们还可以将Session通过其他电脑的StateService来…
[/Quote]

谢谢,我按着这个试了,但还是提示:无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。

ASP.NET State Service已经启动了。
说明:类关系如下:
namespace Asset.BaseInfo
{
public class PageArchitecture :Page
{
public PageArchitecture()
{
}
//雇员号
public string EmpNo
{
get
{
string LoginEmpno = "";
if (HttpContext.Current.Session["LoginEmpno"] == null) //保存登录者 其中loginempno是login.aspx里面登录成功时,记录的
{
HttpContext.Current.Response.Redirect("/btsl/asset/asset/Login.aspx");
}
else
{
LoginEmpno = HttpContext.Current.Session["LoginEmpno"].ToString();
}
return LoginEmpno;
}
}
public class basePage : PageArchitecture
{
protected override void OnLoad(EventArgs e)
{ ...
base.OnLoad(e);
}
}
}

页面B0001 .cs
public partial class B0001 : basePage
{
...
取登录者的时候就用:
string loginempno=Empno;
现经常取不到Empno,有时候过不了两分钟就要求重新登录。。。
}

我在namespace Asset.BaseInfo
{
[Serializable]
public class PageArchitecture :Page
...
但还是报错
zhnzzy 2008-09-03
  • 打赏
  • 举报
回复
现在请将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
{
......
}
zhnzzy 2008-09-03
  • 打赏
  • 举报
回复
我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失
zhnzzy 2008-09-03
  • 打赏
  • 举报
回复

<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>




但是,这样的SESSION是保存在IIS进程中的,有可能不稳定
cjlxm1 2008-09-03
  • 打赏
  • 举报
回复
为什么用localhost:端口号该问感觉还行,刚过了30多分钟进去还可以。
用IP地址该问没过几分钟就不行了。
viki117 2008-09-03
  • 打赏
  • 举报
回复
丢数据库吧,就是IIS重起了,咱session还活着
加载更多回复(33)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧