2010-04-02 13 views
7

Considere una aplicación ASP.NET MVC que requiere que se establezca una variable de sesión. Se usa en toda la aplicación. Se establecerá leyendo un valor hash en la cookie del navegador o después de que el usuario inicie sesión.ASP.NET MVC: asegúrese de que el usuario siempre tenga una variable de sesión establecida

En el modelo de WebForms + Master Page, verifico el Page_Load() de la página maestra. Tal vez no sea el evento final, pero fue fácil de encontrar.

¿Cómo comprobaría y exigiría la existencia de una variable de sesión en ASP.NET MVC? Tenga en cuenta que esta pregunta podría no incluir los datos de inicio de sesión de los usuarios, sino algún otro dato (en primer lugar, el tiempo de visita).

Solución Los intentos

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

¿ha intentado utilizar 'Application_PreRequestHandlerExecute'? – Kiquenet

Respuesta

10

Usted tiene dos opciones.

lógica 1.Place en Initialize función de controlador base

Suponiendo que todos los controladores de heredar de un controlador de base, se puede colocar la lógica necesaria en la anulación de la función Execute() del controlador base.

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. Utilice la función 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 
    } 
} 

Nota: La segunda parte funciona con cualquier aplicación, ASP.NET Web Forms o MVC.

En cuanto a enforcing que tienen una determinada variable de sesión, es muy abierta realmente. Puede redirigir a una determinada página para que llene un formulario o seleccione una opción o algo. O tal vez solo tenga un valor predeterminado que se establece en una determinada clave de sesión si no se encuentra.

EDITAR

Mientras jugaba con esto, me di cuenta de un gran problema con Application_PreRequestHandlerExecute enfoque. El controlador de eventos está siendo llamado para cualquier solicitud hecha al servidor, ya sean archivos .css/.js/.html. No estoy seguro de si esto es un problema con la forma en que está configurada mi estación de trabajo, o simplemente cómo funciona ASP.NET/IIS, por lo que me aseguraré de que no se invoque esto en todas las solicitudes al implementar el enfoque anterior.

Es por las razones anteriores que envolví el trabajo para hacer en la sesión con una declaración if.

+0

@Baddie - ¡gracias por las sugerencias! Lamentablemente, la segunda opción da como resultado 'referencia de objeto no establecida'. He actualizado la pregunta con detalles. ¡Gracias de nuevo! –

+0

Actualizado mi respuesta. Debe utilizar el evento 'Application_PreRequestHandlerExecute' en lugar de' Application_BeginRequest' ya que la 'Session' no se crea allí. Eche un vistazo a mi edición. – Omar

+0

@Omar Esto me ayudó, opción 1. Necesito verificar el rol del usuario para el estado del administrador, y almacenar yay o no en sesión antes de que se ejecute cada acción. Gracias. – webtrifusion

2

No estoy seguro de entender completamente la pregunta, pero lo hago anulando el método OnActionExecuting del controlador.

Aquí hace el código para ver si existe la variable de sesión. Si no, créelo, si es así, úselo.

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

Como otra alternativa, la clase ControllerActionInvoker invoca cada método de acción; se asigna al controlador a través de la fábrica del controlador. Para que pueda subclase este invocador de acción, cada vez que se invoca una acción (anulando el método InvokeAction), compruebe aquí esta existencia ...

Cuestiones relacionadas