工作趣事 之 通常处理程序使用Session(个人亲身经历)

工作趣事 之 一般处理程序使用Session(个人亲身经历)

工作一个月了 接到一个任务

制作一个图库的网站 我用了一天的时间 设计了一下网站的各个功能  开始制作

一开始我做的是“登陆”和“注册”

这些感觉不怎么难 我定的目标是用一天的时间完成

注册的时候 有一个验证码 我先简单的介绍一下验证码的原理 我们在网上见到的验证码基本也是这样的原理:

1.根据要求 随机生成一个字符串 可以是只含有数字 也可以含有数字和字母
2.创建一个Session 将生成的字符串放在创建的Session中
3.最后 在后台中 将用户输入的验证码和Session中保存的验证码做比较 

如果相同 则说明用户输入的验证码正确 则 可以注册


我用生活中的一个例子来说一下:
您可以把Session当做成一个放东西的容器 将一个物品(随机生成的字符串)放在这个容器中
然后再拿来一个相同的物品(用户输入的验证码) 和容器中的物品比较


原理说明白了 说说我是怎么做的吧 
我在一般处理程序里面(.ashx)创建了随机数 ,创建的随机数的图片 并且 创建了Session
但是在.aspx文件中使用Session的时候 犯了一个特别幼稚的错误


先来看一下我在一般处理程序(.ashx)里面创建Session 并给Session赋值
工作趣事 之 通常处理程序使用Session(个人亲身经历)

再来看一下在.aspx中使用Session 和 报错信息

工作趣事 之 通常处理程序使用Session(个人亲身经历)



看到这里 也许您已经看出错误所在了 

对 我没有实现  IRequiresSessionState   接口
工作趣事 之 通常处理程序使用Session(个人亲身经历)


授人鱼不如授人以渔 我就来说说为什么一般处理程序(.ashx)要实现这个接口 而 .aspx却不用实现这个接口 直接拿来能用:

在.aspx文件中 微软以及帮我实现了IRequiresSessionState   在Reflector反编译器中 我们可以查看.aspx是怎么实现 IRequiresSessionState   接口的

工作趣事 之 通常处理程序使用Session(个人亲身经历)工作趣事 之 通常处理程序使用Session(个人亲身经历)


而在一般处理程序里面(.ashx) 需要我们手动的实现 IRequiresSessionState   接口


在第9和第11个事件之间 有一个事件会接受浏览器发过来的SessionID 并根据值到服务器的Session池中找到对应的Session对象 将其引用赋值给当前页面上的Session对象

他先尝试将页面类对象转换成 IRequiresSessionState 接口 如果转换不成功 则不加载Session对象 
如果转换成功 则会从请求报文中拿到Cookie里的SessionID     最后在Session池中找到对应的Session对象 将引用赋值给当前页面的Session

工作趣事 之 通常处理程序使用Session(个人亲身经历)



话说回来 IRequiresSessionState 到底是什么什么接口 这么重要?

呵呵 他是一个标示接口 里面什么都没有 

知识标示了 当前页面中使用了Session

工作趣事 之 通常处理程序使用Session(个人亲身经历)


只要实现了这个接口 在一般处理程序里面 就可以自用的使用了!!!

这样的低级错误 以后我是再也不会犯了 希望这篇文章 能对大家有所帮助 

        关于Session的一些原理 大家可以看 ASP.Net原理篇 之 Session


由于个人能力有限 错误的地方还请您指出 以便我改进  万分感谢!!!



























1楼Doolmo昨天 21:43
来给你顶一个