在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
web程序时,当使用session时总会出现失效而报“未将对象引用设置到对象的实例”的http 500错误,本人比较懒,不想每个地方都用try catch处理,就找到个用httpModule统一处理的方法: 1、新建一个_httpmodule的类,继承IHttpModule接口,为了能在类里面读取session,添加using System.Web.SessionState;,并继承IReadOnlySessionState接口; 2、添加application的AcquireRequestState处理: void context_AcquireRequestState(object sender, EventArgs e) { HttpApplication application = (HttpApplication)sender; HttpContext context = application.Context; context_AcquireRequestState(context, new EventArgs()); } void context_AcquireRequestState(HttpContext context, EventArgs e) { try { if (!context.Request.Path.ToString().Contains("login.aspx")) { context.Session["loginUser"].ToString(); } } catch (Exception ex) { context.Response.Write("{'error':false,'message':'尚未登录!'}"); context.Response.End(); } }
3、添加init,里面注册AcquireRequestState事件: public void Init(HttpApplication context) { context.AcquireRequestState += new EventHandler(context_AcquireRequestState); } 4、webconfig <system.web>节配置: <httpModules> <add name="123" type="_httpmodule"/> </httpModules> 这样当session失效的时候放回错误信息,前台ajax处理返回Json即可。 ps:刚开始我将2、3注册成BeginRequest,可是总取不到Session中的用户信息, 搜索后发现一篇blog(http://www.cnblogs.com/junqilian/archive/2008/03/07/1095454.html),转载如下: 可是,别忙,怎么总取不到Session中的用户信息呢?记录访问日志用户Id这样的信息肯定是需要记录的啊! 后来放狗一搜才发现,还是对aspnet的事件处理流程不理解,Begin_Request时还没有加载Session状态呢,自然就取不到了。 下面是MSDN上提供的事件触发顺序:
AcquireRequestState事件,当实际服务请求的处理程序获得与该请求关联的状态信息时发生。在这个事件发生时才能取到Session中是userId信息。BeginRequest事件在AcquireRequestState之前发生,我们把取Session状态的代码放在BeginRequest中肯定是取不到的。 问题找到了,把日志记录代码放在AcquireRequestState中就可以了,于是改成下面的样子: public void Init(HttpApplication context) void context_AcquireRequestState(object sender, EventArgs e) //原先context_BeginRequest中的代码,不重复贴占地方了 :) //把LogEntry中的信息保存到数据库 } 好了,这样我们继承了IHttpModule接口,实现了一个自定义的LogMudule,这样在用户方面每个页面时,都会自动记录用户的信息记如访问日志数据库中,再也不用到每个页面的Page_Load中去写了,维护起来也方便多了! Yeah~ |
请发表评论