MVC con JQuery: manejando Session Expire

¿Cómo podría manejar la caducidad de la sesión en una aplicación MVC que tiene llamadas del método JQuery Ajax en ciertas páginas? El tema es el siguiente:

  • Cuando el cliente alcanza el tiempo de espera de la sesión, cada uno de mis controladores hereda una clase que verifica si la sesión está activa (buscando información sobre cosas como la sesión del sitio, la sesión de la base de datos, etc.) y redirige al cliente a una nueva página diciendo que expira pero el caso es diferente cuando estoy usando JQuery ajax para llamar a los métodos de los controladores en algunos clics de botones, porque omite la validación de la clase heredada y me permite permanecer en la página, pero cuando el controlador intenta finalizar la ejecución del método, obviamente arroja errores .Net: los objetos no se crean como instancia de objetos, no se encuentran las variables de la sesión, etc., todo debido a la sesión caducada que no se manejó debido a la llamada del método asincrónico.

¿Cómo podría manejar este comportamiento, y cuál es la mejor manera de manejarlo (haciendo todo lo posible por no modificar tantas partes del código de la aplicación)?

Gracias por adelantado.

PD : Podría ser útil decir que estoy usando $.post() de Jquery.

Normalmente, este es un error irrecuperable que generalmente es mejor mostrar como una página de error independiente. Configure la aplicación web para mostrar una página de error personalizada 4nn/5nn y configure jQuery de la siguiente manera:

 $(document).ready(function() { $.ajaxSetup({ error: handleXhrError }); }); function handleXhrError(xhr) { document.open(); document.write(xhr.responseText); document.close(); } 

De esta manera, la página de error 4nn/5nn lado del servidor se mostrará como si hubiera sido causada por una solicitud síncrona. He publicado un tema similar sobre el tema antes.

Otra forma es posponer el tiempo de espera de la sesión de forma ajaxical. Use setInterval() para setInterval() una solicitud de sondeo al servidor (que a su vez básicamente toma la sesión de la solicitud) cada vez que caduque la sesión menos diez segundos.

 setInterval(function() { $.get('poll'); }, intervalInMillis); 

Pero la advertencia es que la sesión sobrevivirá siempre que el cliente tenga abierta la ventana del navegador, lo que a veces puede llevar demasiado tiempo. Si es necesario, puede combinar esto con un tipo de verificador de actividad para minimizar la posibilidad de que la sesión caduque. Aún debe combinar esto con un controlador de errores 4nn/5nn decente.

 $(document).ready(function() { $.active = false; $('body').bind('click keypress', function() { $.active = true; }); checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute. }); function checkActivity(timeout, interval, elapsed) { if ($.active) { elapsed = 0; $.active = false; $.get('poll'); // Let server code basically do a "get session from request". } if (elapsed < timeout) { elapsed += interval; setTimeout(function() { checkActivity(timeout, interval, elapsed); }, interval); } else { alert($.messages.timeout); // "You will be logged out" blah blah. window.location = 'http://example.com/logout'; } }