Saltar al contenido

Mantener la sesión ASP.NET abierta / activa

Solución:

Utilizo JQuery para realizar una simple llamada AJAX a un controlador HTTP ficticio que no hace nada más que mantener viva mi sesión:

function setHeartbeat() {
    setTimeout("heartbeat()", 5*60*1000); // every 5 min
}

function heartbeat() {
    $.get(
        "/SessionHeartbeat.ashx",
        null,
        function(data) {
            //$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)
            setHeartbeat();
        },
        "json"
    );
}

El controlador de sesión puede ser tan simple como:

public class SessionHeartbeatHttpHandler : IHttpHandler, IRequiresSessionState
{
    public bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Session["Heartbeat"] = DateTime.Now;
    }
}

La clave es agregar IRequiresSessionState; de ​​lo contrario, la sesión no estará disponible (= nulo). Por supuesto, el controlador también puede devolver un objeto serializado JSON si algunos datos deben devolverse al JavaScript que realiza la llamada.

Disponible a través de web.config:

<httpHandlers>
    <add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeatHttpHandler"/>
</httpHandlers>

adicional de balexandre el 14 de agosto de 2012

Me gustó mucho este ejemplo, que quiero mejorar con HTML / CSS y la parte de ritmo.

cambia esto

//$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)

dentro

beatHeart(2); // just a little "red flash" in the corner :)

y añadir

// beat the heart 
// 'times' (int): nr of times to beat
function beatHeart(times) {
    var interval = setInterval(function () {
        $(".heartbeat").fadeIn(500, function () {
            $(".heartbeat").fadeOut(500);
        });
    }, 1000); // beat every second

    // after n times, let's clear the interval (adding 100ms of safe gap)
    setTimeout(function () { clearInterval(interval); }, (1000 * times) + 100);
}

HTML y CSS

<div class="heartbeat">&hearts;</div>

/* HEARBEAT */
.heartbeat {
    position: absolute;
    display: none;
    margin: 5px;
    color: red;
    right: 0;
    top: 0;
}

aquí hay un ejemplo vivo solo por la parte de la paliza: http://jsbin.com/ibagob/1/

Si está utilizando ASP.NET MVC, no necesita un controlador HTTP adicional ni algunas modificaciones del archivo web.config. Todo lo que necesita, solo para agregar una acción simple en un controlador Inicio / Común:

[HttpPost]
public JsonResult KeepSessionAlive() {
    return new JsonResult {Data = "Success"};
}

, escriba un fragmento de código JavaScript como este (lo he puesto en uno de los archivos JavaScript del sitio):

var keepSessionAlive = false;
var keepSessionAliveUrl = null;

function SetupSessionUpdater(actionUrl) {
    keepSessionAliveUrl = actionUrl;
    var container = $("#body");
    container.mousemove(function () { keepSessionAlive = true; });
    container.keydown(function () { keepSessionAlive = true; });
    CheckToKeepSessionAlive();
}

function CheckToKeepSessionAlive() {
    setTimeout("KeepSessionAlive()", 5*60*1000);
}

function KeepSessionAlive() {
    if (keepSessionAlive && keepSessionAliveUrl != null) {
        $.ajax({
            type: "POST",
            url: keepSessionAliveUrl,
            success: function () { keepSessionAlive = false; }
        });
    }
    CheckToKeepSessionAlive();
}

e inicialice esta funcionalidad llamando a una función de JavaScript:

SetupSessionUpdater('/Home/KeepSessionAlive');

¡Tenga en cuenta! He implementado esta funcionalidad solo para usuarios autorizados (no hay razón para mantener el estado de la sesión para los invitados en la mayoría de los casos) y la decisión de mantener el estado de la sesión activo no solo se basa en: si el navegador está abierto o no, pero el usuario autorizado debe realizar alguna actividad en el sitio (mueva el mouse o escriba alguna tecla).

Siempre que realiza una solicitud al servidor, el tiempo de espera de la sesión se restablece. Por lo tanto, puede realizar una llamada ajax a un controlador HTTP vacío en el servidor, pero asegúrese de que la caché del controlador esté deshabilitada; de lo contrario, el navegador almacenará en caché su controlador y no realizará una nueva solicitud.

KeepSessionAlive.ashx.cs

public class KeepSessionAlive : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
            context.Response.Cache.SetNoStore();
            context.Response.Cache.SetNoServerCaching();
        }
    }

.JS:

window.onload = function () {
        setInterval("KeepSessionAlive()", 60000)
}

 function KeepSessionAlive() {
 url = "/KeepSessionAlive.ashx?";
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", url, true);
        xmlHttp.send();
        }

@veggerby: no hay necesidad de la sobrecarga de almacenar variables en la sesión. Basta con realizar una solicitud al servidor.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *