用AspJpeg组件,按宽高比例,真正生成缩略图

laifangsong's .NET blog

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

看似诡异的session赋值错误

Posted on 2007-04-14 17:45  laifangsong  阅读(1453)  评论(4编辑  收藏  举报


最近做一个小系统,在系统管理后台,做了一个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页面中的<mailto:%@%20Page&amp;amp;nbsp;&amp;amp;nbsp;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(System.EventArgs e)
   {
          if(Session["Key"]!="")
         {
               ...
         }       
   }
}