一般处理程序使用Session报错(未将对象引用设置到对象实例)
工作一个月了 接到一个任务
制作一个图库的网站 我用了一天的时间 设计了一下网站的各个功能 开始制作
一开始我做的是“登陆”和“注册”
这些感觉不怎么难 我定的目标是用一天的时间完成
注册的时候 有一个验证码 我先简单的介绍一下验证码的原理 我们在网上见到的验证码基本也是这样的原理:
1.根据要求 随机生成一个字符串 可以是只含有数字 也可以含有数字和字母
2.创建一个Session 将生成的字符串放在创建的Session中
3.最后 在后台中 将用户输入的验证码和Session中保存的验证码做比较
如果相同 则说明用户输入的验证码正确 则 可以注册
我用生活中的一个例子来说一下:
您可以把Session当做成一个放东西的容器 将一个物品(随机生成的字符串)放在这个容器中
然后再拿来一个相同的物品(用户输入的验证码) 和容器中的物品比较
原理说明白了 说说我是怎么做的吧
我在一般处理程序里面(.ashx)创建了随机数 ,创建的随机数的图片 并且 创建了Session
但是在.aspx文件中使用Session的时候 犯了一个特别幼稚的错误
先来看一下我在一般处理程序(.ashx)里面创建Session 并给Session赋值
再来看一下在.aspx中使用Session 和 报错信息
看到这里 也许您已经看出错误所在了
对 我没有实现 IRequiresSessionState 接口
授人鱼不如授人以渔 我就来说说为什么一般处理程序(.ashx)要实现这个接口 而 .aspx却不用实现这个接口 直接拿来能用:
在.aspx文件中 微软以及帮我实现了IRequiresSessionState 在Reflector反编译器中 我们可以查看.aspx是怎么实现 IRequiresSessionState 接口的
而在一般处理程序里面(.ashx) 需要我们手动的实现 IRequiresSessionState 接口
在第9和第11个事件之间 有一个事件会接受浏览器发过来的SessionID 并根据值到服务器的Session池中找到对应的Session对象 将其引用赋值给当前页面上的Session对象
他先尝试将页面类对象转换成 IRequiresSessionState 接口 如果转换不成功 则不加载Session对象
如果转换成功 则会从请求报文中拿到Cookie里的SessionID 最后在Session池中找到对应的Session对象 将引用赋值给当前页面的Session
话说回来 IRequiresSessionState 到底是什么什么接口 这么重要?
呵呵 他是一个标示接口 里面什么都没有
知识标示了 当前页面中使用了Session
只要实现了这个接口 在一般处理程序里面 就可以自用的使用了!!!
这样的低级错误 以后我是再也不会犯了 希望这篇文章 能对大家有所帮助