ASP.NET MVC:确保用户始终拥有会话变量集

问题描述:

考虑需要设置会话变量的ASP.NET MVC应用程序。它在整个应用程序中使用。它将通过读取浏览器cookie上的哈希值或用户登录后进行设置。ASP.NET MVC:确保用户始终拥有会话变量集

在WebForms +主页面模型中,我会检查母版页的Page_Load()。也许不是最终的事件,但它很容易找到。

你将如何检查和强制ASP.NET MVC中的会话变量的存在?考虑到这个问题可能不涉及用户登录细节,但可能包含其他一些数据(可能是第一次访问时间)。

解决方案尝试

public void Application_BeginRequest(Object source, EventArgs e) 
{ 
    HttpApplication application = (HttpApplication)source; 
    HttpContext context = application.Context; 

    context.Session["SomeDateTime"] = DateTime.Now.ToString(); 

    // results in Object reference not set to an instance of an object. 
    // context.Session is null 
} 
+0

你试过使用Application_PreRequestHandlerExecute吗? – Kiquenet 2016-06-22 10:43:39

你有两个选择。在基本控制器的功能Initialize

假设所有的控制器从基本控制器继承

1.Place逻辑,你可以放置在基本控制器的功能Execute()的覆盖所需的逻辑。

public class BaseController : Controller 
{ 
    public BaseController() 
    { 

    } 

    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
      // check if the user has the value here using the requestContext.HttpContext object 
    } 
{ 

2.使用在Global.asax void Application_PreRequestHandlerExecute(Object source, EventArgs e)功能

public void Application_PreRequestHandlerExecute(Object source, EventArgs e) 
{ 
    HttpApplication application = (HttpApplication)source; 
    HttpContext context = application.Context; 

    // use an if statement to make sure the request is not for a static file (js/css/html etc.) 
    if(context != null && context.Session != null) 
    { 
      // use context to work the session 
    } 
} 

注:第二部分适用于任何ASP.NET应用程序的WebForms或MVC。

至于enforcing他们有一定的会话变量,它真的很开放。您可以重定向到某个页面,以便填写表单或选择一个选项或其他内容。或者,如果找不到某个会话密钥,可能只需要设置一个默认值即可。

编辑

虽然玩这个,我注意到Application_PreRequestHandlerExecute办法的一个大问题。该事件处理程序正在调用对服务器的任何请求,无论是.css/.js/.html文件。我不确定这是否是我的工作站设置方式的问题,或者只是ASP.NET/IIS的工作原理,所以我会确保在实现上述方法时不会在所有请求中调用此方法。

由于之前的原因,我把这项工作用if声明包裹在会议中。

+0

@Baddie - 感谢您的建议!不幸的是,第二个选项导致“未设置对象引用”。我已经用细节更新了这个问题。再次感谢! – 2010-04-02 14:06:16

+0

更新了我的答案。您需要使用Application_PreRequestHandlerExecute事件而不是Application_BeginRequest,因为Session不是在那里建立的。看看我的编辑。 – Omar 2010-04-05 12:48:16

+0

@Omar这对我有帮助,选项1.需要检查管理员状态的用户角色,并在每个操作执行前将会话或会话存储在会话中。谢谢。 – webtrifusion 2011-08-19 16:29:51

不知道我完全理解这个问题,但我通过覆盖控制器的OnActionExecuting方法来做到这一点。

在那里您可以执行代码以查看会话变量是否存在。如果没有,创建它,如果是的话就使用它。

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.Session != null) 
    { 
     //TODO: Get value from session etc. 
    } 
    base.OnActionExecuting(filterContext); 
} 

作为另一种选择,ControllerActionInvoker类调用每个操作方法;它通过控制器工厂分配给控制器。所以你可以继承这个动作调用器,每次一个动作被调用时(通过覆盖InvokeAction方法)在这里检查这个存在......