laifangsong's blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 51, comments - 187, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

看似诡异的session赋值错误

Posted on 2007-04-14 17:45 laifangsong 阅读(441) 评论(3)  编辑 收藏 所属分类: bugs

最近做一个小系统,在系统管理后台,做了一个PageBase类,供后台其他页面继承。
在该类的构造函数中验证是否Session有值;有值表示处于登录状态,否则返回后台登录页面。

但一写类似这样的代码: if(Session["key"]!=""){...}, 就提示错误:
只有在配置文件或 Page 指令中将启用会话状态设置为真时,才可以使用会话状态
代码大略这样:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
   public PageBase()
   {
         if(Session["Key"]<>"")
         {
               ...
         }  
   }
   ...
}
Admin_Index.aspx:
================
...
...

Admin_Index.cs
================
public class Admin_Index : PageBase
{
   ...
   private void Page_Load(object sender, System.EventArgs e)
   {
        ...
   }
   ...
}

做了以下测试,查找原因:
1.  在 Admin_Index.cs的Page_Load事件中读写Session,结果:一切正常,可以正常赋值
2.  在 Admin_Index.cs的构造函数中读写Session,结果:提示同样错误
3.  在 PageBase.cs的任意位置读写Session,结果:提示同样错误
似乎只能在Page_Load等系统事件中,才能正常读写。

google了一下,发现可能的几个原因:
1.web.config中 <page enableSessionState="false" />,应为"true"
2.aspx页面中的<%@ Page  enableSessionState="false"%>,应为"true"
3.Session["key"]="" 改为 System.Web.Httpcontent.Current.Session["key"]=""

由于Page_Load事件中Session读写正常,基本可以排除上面几个原因;并且可以判断可能是 Session写错了地方。

之后,又搜到一篇:http://www.nqqn.com/ym/183/102910.htm
了解到大概原因:在构造函数运行时,Httpcontent.Current.Session对象未生成,不能引用.
(google下 asp.net事件模型,可以了解下 Session对象是何时产生的);将Session读写放在PaeBase.cs的OnInit事件中,不再有错误。


正确写法:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
   public PageBase()
   {
   }
  protected override void OnInit()
   {
          if(Session["Key"]!="")
         {
               ...
         }       
   }
}

Feedback

#1楼    回复  引用    

2007-04-28 16:01 by xixi [未注册用户]
终于找到了...

#2楼    回复  引用    

2007-09-05 10:02 by K [未注册用户]
c#好象非等于是!=吧....

#3楼 [楼主]   回复  引用  查看    

2007-09-05 18:20 by laifangsong      
是 !=
我写错了,马上改下