我有一个MVC2网络应用程序,其中我刚刚实现了一些会话超时代码。在Global.asax
中,我添加了一个Session_End
处理程序,用于检查记录是否已打开以进行编辑,如果是,则向外部系统发出Web Service调用以回滚存储库中的记录,因此它是未锁定在“打开编辑”状态。该记录仍显示在用户的浏览器中,因为我们无法将消息推送到浏览器以关闭记录。
当用户下一次与(现在超时)页面交互时,例如为了刷新,取消,保存或提交它,Web应用程序看到用户未登录(会话已过期,因此登录随之而来),并重定向到登录页面。
在登录页面上,我想显示一条消息,说明用户被重定向的原因,例如:“您的会话超时;请再次登录。如果您打开了记录,则会回滚到其先前状态。“
来自Global.asax
的 问题:,我可以在哪里存储邮件,以便登录控制器或视图可以在重定向时找到它?我似乎无法在ViewData
中获得对Global.asax
的引用。当我像它一样引用它时:
System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData["ErrorMessage"] = "Your session timed out..."
我收到错误:
An object reference is required for the non-static field, method, or property 'System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData.get'
我正在尝试做什么,而我只是不知道引用ViewData
的正确方法,或ViewData
无法访问Global.asax
?在这种情况下,设置来自Global.asax
的消息在视图中显示的最佳选择是什么?
答案 0 :(得分:3)
@Val - 首先,您不应该以这种方式进行身份验证。您应该使用管道和FormsAuthentication或类似的。这可能会产生可被攻击者或恶意软件机器人利用的安全漏洞。其次,不能保证Session_End会触发,因此记录可以无限期锁定。例如,如果工作进程被回收,则不会调用任何Session_End,因此您不能依赖此机制来解锁资源。
我建议你重新考虑你的设计,不要以这种方式锁定记录以进行编辑,也不要将session_end用于任何至关重要的事情。