viernes, 16 de julio de 2010

[ASP.NET] Mantener la Session Activa Indefinidamente

 

Introducción


El objetivo que persigue el articulo es demostrar como mediante llamadas asíncronas realizadas por medio de la librería de jquery se puede mantener la Session activa en el servidor de forma indefinida sin que este expire en un tiempo determinado.

 

Mantener la Session Activa


Asp.net expira la Session de un usuario cuando un tiempo prolongado de inactividad indicaría que ya no se esta usando la pagina, pero a veces es necesario permitir que el usuario tome varias horas sin actividad, aunque en la configuración del servidor el timeout este definido en un tiempo reducido.

La idea del ejemplo es realizar de forma transparente para el usuario, y sin que se refresque la pagina, una invocación al servidor, para que este registre dicha actividad.

Para lograr el objetivo se hará uso de dos librerías de jquery:

- la principal realizará las invocaciones a los WebMethod definidos en la pagina, usando la funcionalidad de $.ajax

- la otra librería permitirá especificar desde javascript el intervalo de tiempo en que debe invocarse al método expuesto en el servidor web, jQuery Timers 

[javascript]

<script language="javascript" type="text/javascript">

        $().ready(function() {

        $(document).everyTime(3000, function() {
        
                $.ajax({
                    type: "POST",
                    url: "ValidarSession1.aspx/KeepActiveSession",
                    data: {},
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: true,
                    success: VerifySessionState,
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        alert(textStatus + ": " + XMLHttpRequest.responseText);
                    }
                });
                
            });

     
        });

        var cantValidaciones = 0;

        function VerifySessionState(result) {

            if (result.d) {
                $("#EstadoSession").text("activo");
            }
            else
                $("#EstadoSession").text("expiro");

            $("#cantValidaciones").text(cantValidaciones);
            cantValidaciones++;

        }

        function SessionAbandon() {

            $.ajax({
                type: "POST",
                url: "ValidarSession1.aspx/SessionAbandon",
                data: {},
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: true,
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus + ": " + XMLHttpRequest.responseText);
                }
            });
            
        }
    </script>

 

[C#]

public partial class ValidarSession1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Session["datos"] = true;
    }


    [WebMethod()]
    public static bool KeepActiveSession()
    {
        if (HttpContext.Current.Session["datos"] != null)
            return true;
        else
            return false;
    }

    [WebMethod()]
    public static void SessionAbandon()
    {
        HttpContext.Current.Session.Remove("datos");
    }

}

En el código puede observarse los WebMethod expuestos en la página, y como son invocados desde javascript de forma asíncrona, usando una llamada ajax, mediante el uso de $.ajax

 

Consideraciones de los Ejemplos


Dentro de ejemplo de código se encontraran dos páginas aspx, ambas realizan la misma operación, solo que aplican distintas técnicas.

En la pagina ValidarSession1.aspx se verifica explícitamente que determinada key de la session esta disponible. La idea de este ejemplo es demostrar que tanto la pagina como los servicios web que se están usando comparten la misma Session y se puede acceder a los datos allí guardados

La pagina ValidarSession2.aspx, si bien la forma de comunicarse es la misma, la validaciones de la session ha cambiado, aquí no se usa una key determinada, sino que se valida el objeto de forma general.

En el ejemplo para que sea practico se estableció un tiempo de 3000 ms (3 seg), para que valide la Session, pero si la idea es mantener la session activa con especificar un tiempo cercano al definido en el expiración de la sesión alcanzaría.

Por ejemplo si se determino en el IIS que el sitio tiene un timeout de session en 20min, especificando un tiempo de 15000 ms (15 min) seria suficiente para evitar que la session expire.

La solución fue desarrollada con Visual Studio 2008.

 

[C#] 
[VB.NET] 

91 comentarios:

  1. Leandro...
    tenés realmente muy buenos post
    Gracias eh.

    me podes hacer una sugerencia?
    dónde puedo conseguir ejemplos o consejos a la hora de elaborar mi propio framework basado en asp.net vb.net .... capa datos, utilitarios, y esas cosas..
    o qué métodos puedo implementar dentro de la clase Utilitarios?

    Gracias...

    ResponderEliminar
  2. hola

    un buen sitio donde podrias ver temas de arquitectura seria:

    Centro de Arquitectura - MSDN

    Con respecto a los utilitario, en realidad estas son clases que ayudaran a llevar a cabo determinada tarea, yo los denomino ams bien Helper, serian clases estaticas que realizan una tarea concreta, por ejemplo convertir formatos de fechas, procesar algun archivo, etc
    No hay mucho con respecto a estos porque es funcionalidad que simplemente se le dio un nombre, despues que lo llames Utilitarios, Helper, Util, etc, es indistinto.

    saludos

    ResponderEliminar
    Respuestas
    1. Hola Leo.. como hago para indicarle al sistema que solo espere 60 minutos la sesión

      Eliminar
    2. Tienes que modificar la libreria de Jquery, donde dice '3000', ahi pones lo que requieras, recuerda que son milisegundos(3 segundos), lo que si quieres que sea media hora = 30000

      Eliminar
  3. Hola buen post.
    Una pregunta quiero hacer un formulario para ingresar datos utilizando asp.net con c# 2008, pero comon hago que pormedio de jquery llame a los metodos creados en mis clases de c#. en tu ejemplo utilizas ajax. como combinarlo? saludos

    ResponderEliminar
  4. hola Josengan

    Lo harias por medio de los Page Methods, o sea crearias en las paginas donde requieres de la funcionalidad metodos publicos con el atributo [WebMethod] y luego por medio de $.ajax los invocas, tal cual muestra este articulo.

    Dentro de estos metodos crearias las instancias de las clases que has creado y luego usarias loe metodos que estas definen

    [WebMethod]
    public void CreateProducto(){

    ProductoClass prod = new ProductoClass();
    prod.BuildProducto();

    }

    como veras ProductoClass es la clase que tue has creado, y BuildProducto() es el metodo, todo dentro de un WebMethod que invocarias desde el cliente con $.ajax

    saludos

    ResponderEliminar
  5. Hola, lo que pasa que ya busque como invocar a la funcio pero ahora quiero tener el identity insertado en la pagina. para modificarlo.

    Imagina que lleno mi formulario y le doy guardar, al guardar obtengo el id que se acaba de insertar pero como hago o mantengo el Id si utili jquery:
    function inser {
    $.post (formulario.aspx,Parametros)
    }
    ....etc
    entonces como regresar el ID.
    Intento poner un Hiddenfield pero nada...gracias por la ayuda

    ResponderEliminar
  6. hola Josengan

    Cuando dices "entonces como regresar el ID.", la idea es retornando en que accion?, en un postback

    Si estas usando jquery para realziar las operaciones sin postback de la pagina porque es que necesitas el id para ser retoenado

    si sigues operando con javascript podrias alli mismo tomando el retorno de $.post guardar en una variable de jaavscript el valor del id generado

    igualmente si necesitas ponerlo en un hidden de asp.net para enviarlo, estas validando que se asigne correctamente ?

    recuerda que ese hidden es de asp.net, por lo tanto la seelccion desde jquery la haces usando

    $('#<%=HiddenId.ClienteID%>')

    hay que suar el ClienteID para poder seleccionar el hidden

    saludos

    ResponderEliminar
  7. Hola gracias por la ayuda.
    Una pregunta imagina que tengo un formulario (pag1) y hay boton que llama a otra pagina (pag2).
    La pag1 en varios ejemplos veo que tienes un div que al llamar a la otra se agrega en ese div.

    Entonces yo tengo una pagina que tiene un masterPage. Hay alguna manera de llamar con ajax o jquery
    ? Para cargar la pagina.

    ResponderEliminar
  8. Hola Leandro.
    Hay manera de usar el grid view con ajax o jquery. Por ejemplo:
    Tengo un gridview con datos y en cada row tienes un boton de editar y eliminar que van a la base de datos segun el caso. Entonces lo que quiero hacer es cuando le de a editar llame a otro form por ajax o jquery y le mande el Id de tal forma que se cargue en esa pagina los datos claro utilizando ajax o jquery en la otra. Y cuando le de click a boton de delete muestre un popup aceptar o cancelr, al dar aceptar pues vaya a la BD y al regresar pues se refresque el grid. utilizando ajax o jquery.

    o como regresar un tabla con el webthod y asignarselo al control desde el jquery?

    ResponderEliminar
  9. hola Josengan

    No me quedo claro la parte que dice "La pag1 en varios ejemplos veo que tienes un div que al llamar a la otra se agrega en ese div"

    o sea necesitas mostrar la pag2 en un popup?

    si es asi podrias usar los de jquery

    jquery dialog


    saludos

    ResponderEliminar
  10. hola Josengan

    desplegar un popup con informacion de la row del GridView se pdorias ahcer de forma simple usando el

    ModalPopup

    Si usas este en conjunto al UpdatePanel, podrias lanzar el evento SelectedindexChange del boton de la row del gridview, lo cual generaria un postback al servidor, en el evento cargarias los datos del row del gridview en los controles que forman el dialog y luego invocas el Show() del dialog para que al retornar al cliente se muestre

    saludos

    ResponderEliminar
  11. Gracias Leandro.
    He visto muchos post de este tipo. Per no consigo mantener la session activa en una pagina q usa identificacion windows y es segura https.
    Funciona tu metodo en una pagina https?
    Gracias

    ResponderEliminar
  12. hola Falconetic

    en principio no veo porque deberia tener problemas

    este esta integrado al browser del cliente, por lo tanto el id se session se mantiene, por lo tanto la seguridad tambien aunque sea windows

    que sea https no deberia afectarlo porque invocar por medio de $.ajax sigue dentro del contexto del sitio que se esta accediendo

    cual seria el problema que estas teniendo ?

    saludos

    ResponderEliminar
  13. Buenas de nuevo Leandro

    Llevo buscando todo el día y no encuentro la manera de cerrar una sesion en ASP.NET

    Mi problema es el siguiente, tengo una aplicación web en la que hay unos usuarios y quiero que despues de un minuto inactivo el navegador redireccione automaticamente a la pagina de error... es eso posible?

    Probé a poner en el web.config en el sessionstate el timeout = 1 y nada....

    Gracias antes de nada

    ResponderEliminar
  14. hola Adri

    no creo que usar la session para esto que planteas sea lo adecuado

    porque recuerda que la session trabaja a nivel de servidor, o sea es 1 min de inactividad sin postback al server, el usuario puede estar 10 min con la pantalla y luego cuando quiera confirmar es alli donde fallara

    si quieres algo en el cliente deberas hacerlo por javascript, o jquery, quizas poder un setTimeout

    el tema va a ser detectar la inactividad en el cliente

    saludos

    ResponderEliminar
  15. amigazo necesito de tu ayuda, espero puedas ayudarme yo la verdad no se casi nada de este rollo, y tengo una pagina ke necesito mantener abierta porke cada 5 min si no hago alguan actividad me cierra la secion, y pss yo salgo a hacer otras cosas y cuando trato de entrar alguien mas ya la ocupada el chiste de todo esto es ke kisiera mantenerla abierta aunke yo no este usandola espero me puedas ayudar de antemano muchas gracias,,,,espero me dejes tu correo para agregarte porfa y tambien te dejo el mio espero me puedas agregar
    recargitas@gmail.com

    ResponderEliminar
  16. hola rafa pim

    que raro que el sitio tenga un timeout tan pequeño de 5 min, proque no lo configuraron para que sea de 20 min que es el valor por defecto

    igual una duda este desarrollo es tuyo, o sea trara de una pagina de terceros?

    porque sino puede configurar el sitio o no tienes el codigo, dudo que se pueda hacer algo

    saludos

    ResponderEliminar
  17. Hola Leandro,

    Estupendo tu publicación de como mantener la session activa indefinidamente. Tengo una pregunta que hojala me puedas responder: cuando el formulario que hace la intervención para mantener la session activa abre una ventana tipo modal, por ejemplo para que el usuario haga una busqueda de algo en una tabla, hay que implementarle a este nuevo formulario la rutina de mantener la session activa? o con la rutina del formulario padre es suficiente?

    Saludos;

    Julio Páez

    ResponderEliminar
  18. hola Julio

    la impleemntacion para mantener los check aplcia solo al grid, por lo que si este control es solo uno y esta en el form padre deberia alcanzar

    ahora si en el popup que se abre hay otro grid que tambien debe manetener estado de los check eso si requiere una segunda implementacion para mantener la info de ese otro grid

    recuerda que dentro de la clase que mantiene la session se usa un objeto Session, dos listas de datos diferentes no sabria manajar

    quizas se podria ver la forma de que la key sea variable por cada grid se que este utilizando asi la clase es solo una y varia la key de la session que use segun el grid que se este evaluando

    saludos

    ResponderEliminar
  19. Hola Leandro, tu ejemplo me ayuda bastante. Yo tengo una aplicación web basada en el membership de asp.net y mi servidor esta por medio de hosting por tanto no me permite modificar el tiempo de sesion del usuario, como podria aplicar este ejemplo a mi aplicación para que el usuario no tenga que hacer log nuevamente.

    ResponderEliminar
  20. hola Tse

    pero la autenticacion si usas asp.net membership no deberias realizarlo con ninguna session

    Login – Usando Password con Hash

    como veras configuras el web.config y autentivas usando

    FormsAuthentication.RedirectFromLoginPage()

    pero no se usa ninguna session

    saludos

    ResponderEliminar
  21. Hola Leandro, muy bueno el post, muchas gracias y muchas gracias por todas las ayudas q nos dejas, me han servido muchisimo.
    Probé este código para mantener la session activa en una pagina aspx y funciona muy bien.
    Pero tengo en mi aplicación una master page q es de donde realmente tengo q controlar q la session este activa indefinidamente y al momento de poner el código javascript en la máster, no me funciona.
    Lo estoy haciendo dentro de la etiqueta head de la master y el único cambio q hago es en url: "ValidarSession1.aspx/KeepActiveSession", yo lo tengo url: "mtpPrincipal.master/KeepActiveSession", el resto del código esta igual, no se por q no me funciona, no se si tienes alguna idea del por q.
    Muchas gracias.

    ResponderEliminar
  22. hola fercho

    cuando usas masterpage deberias crear una pagina que sirva de forma generica
    o sea deberias crear un aspx (a la cal no le pondras en el html nada) definiendo alli el webmethod

    entronces desde la master vas a invocar a esta pagina que cumplira la funcionalidad genericoa para esta validacion, como esta separada del resto podra ser invocada sin problemas desde todas las paginas que implementen la master

    asi no tiene la necesidad de poner ese webmethod en todas las paginas que usen la master

    saludos

    ResponderEliminar
  23. Hola Leandro, gracias por la pronta respuesta.

    estoy apenas empezando con esta tecnología ASP.net y no se si entendí bien.

    Ya cree una pagina genérica aspx en la cual incluí el código javascript y los webmethod.

    Pero no se a q te refieres ni como hacerlo, cuando dices q debo invocar esta pagina desde la master.

    Me podrías direccionar en este tema?

    Muchas gracias.

    ResponderEliminar
  24. hola

    a donde apuntaba es que en esa pagina generica solo definas el webmethod y nada mas

    despues desde el javascript que estaria en la masterpage invocas al webmethod definiendo la url de la pagina generica

    o sea usando $.ajax de la master que consuma el servicio que esta la pagina aspx

    saludos

    ResponderEliminar
  25. hola Leandro,

    Muchas gracias, me funciona perfecto desde la master.

    Debo apuntar que cambie los url, para q la app encontrara los jquery y la pagina asp con los webmethod.
    Me explico por si le sirve a alguien mas: tengo la master en el directorio raíz de mi proyecto, las paginas están en un directorio llamado "Paginas" y los jquery en otro directorio llamado "js".
    Cometí el error de escribir las url para ubicar los jquery desde la raíz del proyecto: "js/jquery.timers.js". Cuando en realidad debía apuntarlo desde el directorio "Paginas": "../js/jquery.timers.js".
    Resuelto esto, todo funciona perfecto.

    Muchas gracias por la ayuda.

    ResponderEliminar
  26. Buen dia.

    Leandro, tengo una inquietud. Tengo una pagina donde realizo un busquedad por filtros, en esa misma tengo una funcionalidad que abre un popup, cuando cierro el popup, el sistema hace el postback y se me pierden todos los filtros aplicados.

    Puedo usar esto para mantener los filtros?

    ResponderEliminar
  27. Hola Leandro.

    Tengo una pagina que genera un reporte con determinados filtros, en esa misma abro un popup para ver detalles de los resultados, el problema es que cuando cierro el popup se me pierden los filtros. Que puedo hacer para conservarlos?

    ResponderEliminar
  28. hola Cristian

    algo que no has comentado como es que implementas el popup, quizas usas window.open() de javascript, o jquery Dialog, o modalpopupextender de ajax toolkit?

    porque las tecncias para cada caso cambian

    analiza

    [ASP.NET] PopUp Filtro – usando window.open()

    pero alli mismo veras tambien las implementaciones para los otros casos

    saludos

    ResponderEliminar
  29. Hola Leandro, Gracias por ayudarnos con todo tu conocimiento.
    Me gustaría saber que debo hacer para aplicar cambios a un sitio web que se encuentra en IIS. Solo debo modificar 3 lineas de código y no sé como hacerlo.

    Agradecería inmensamente tu ayuda.

    ResponderEliminar
  30. hola Jheison

    pero tienes el codigo y puedes editarlo en el Visual Studio ?

    o solo tienes la version que se hizo el deploy en el sitio web en el iis

    sino tienes los fuentes podrias cambiar quizas el html y javascript, pero no vas a poder cambiar nada en el codigo .net, ya que este seguro compila a una dll que tienes en el \bin del sitio

    saludos

    ResponderEliminar
  31. Gracias por tu respuesta Leandro.
    Si tengo el codigo completo del sitio web.
    Que debo hacer?

    ResponderEliminar
  32. hola Jheison

    si tienes el codiog y el visual sutdio podrias editar alli la solucion validando que compile de forma correcta sin errores

    si lo hace solo sera cuestion de conocer que cambio realizar, pero no comentas que nivel de conocimientos de programacion tienes para poder aplicar la modificacion

    saludos

    ResponderEliminar
  33. Luego que realizo los cambios tengo que volver a publicar?... debo cambiar todos los archivos compilados?.... afectaría esto a los usuarios que esten trabajando en el sitio?..

    Yo soy novato en esto, siempre he realizado sitios de prueba pero nunca he realizado una publicación.

    Nuevamente gracias por tu ayuda!

    ResponderEliminar
  34. hola Jheison

    [ASP.NET] Web Service - Publicar en IIS Windows 7

    alli explico como usarias la opcion de publicacion del VS

    saludos

    ResponderEliminar
  35. Hola Leandro ! Excelente post, tengo una pregunta, por medio de jquery, cómo puedo comprobar si existe una conexión a internet?

    ResponderEliminar
  36. hola Ana

    que tipo de invocacion realizas con jquery? o sea si vas a utilizar $.ajax simplemente controla el error

    o sea no te preocupa si tienes internet o no, solo realiza el request al webmethod y si falla con un mensaje de http lo informas, por supuesto la operacion no se realizara porque fallo

    a donde voy es que lo trabajas de forma general y no particular sino hay internet, porque puede que el DNS por alguna causa no resuelve la url y tambien falle, etc, las causas son miles en un ambiente web

    saludos

    ResponderEliminar
  37. Hola Leandro,estoy utilizando $.ajax , y he seguido tu consejo, me ayudó bastante muchas gracias. Saludos!

    ResponderEliminar
  38. hola leandro :
    Muy buen articulo, justo estaba buscando un forma sencilla de renovar la session de mi aplicacion.
    Te queria consultar porque en el metodo ValidarSession2 metodo de pagina preguntas por IsNewSession
    para que servirioa isNewSession?

    Gracias...

    ResponderEliminar
  39. hola sebastianv

    en el articulo lo menciono, se usa para no tener que consultar por una determinada key en la session

    saludos

    ResponderEliminar
  40. Saludos Leandro, Cómo podría hacer para cerrar la sesión activa de un usuario registrado en una sección privada de un Sitio en .Net, utilizando para ello un botón de "Desconectarse"?

    ResponderEliminar
  41. hola Jonathan

    a que llamas seccion privada ? por la verdad no entendi el planteo del problema

    saludos

    ResponderEliminar
  42. Leandro:

    Como asigno un valor a una variable session, por ejemplo esta asignación con valor definido funciona, pero si quiero asignarle desde una variable de js ??

    Esto funciona:
    <%session("Nro") = "2312"%>

    Esto no funciona:
    var p = "456";
    <%Session("name")=%> = p;

    Donde estaria el error ??

    Gracias, MaFuMo

    ResponderEliminar
  43. hola M@FuMo

    desde codigo cliente no puedes asignar un valor a la session porque esta este en el servidor

    deberias realizar una invocacion ajax para poder cambiarla

    usnado una tecnoca como ser:

    [ASP.NET] Mantener la Session Activa Indefinidamente

    en ese articulo accedo a la session usando $.ajax, invocando un webmethod
    saludos

    ResponderEliminar
  44. y para mantener la sesion indefinidamente pero desde mvc? es lo mismo?

    ResponderEliminar
  45. hola juan

    en mvc tambien existe el objeto Session, por lo que podrias hacer que el $.ajax invoque un action de algun controller para implementar lo mismo que hace el webmethod en este articulo

    saludos

    ResponderEliminar
  46. Hola Leandro, sabes me gustaria que me ayudaras con un problemita que traego.
    mira estoy tratando de cargar a mi servidor un archivo de mp3 grande aprox 100MB o mas, con archivos pequeños no batallo pero en los grandes despues de pasar un tiempo se corta la coneccion y me da un error te muestro como tengo el web.config:











    y la verdad no entiendo porque no toma el valor:executionTimeout="7200"
    te agradeceria mucho tu ayuda, Gracias, espero tu respuesta.

    ResponderEliminar
  47. ha se me paso decir que estoy con archivos aspx desde vb studio 2012 con visual basic trabajando.

    ResponderEliminar
  48. hola isova

    pero como subes el archivo usas el FileUpload ? porque si es asi recuerda que tiene un limite de 4Mb

    Limiting the File Upload Size in ASP.NET


    tienes que aunmentar en el config el tamaño permitido
    saludos

    ResponderEliminar
  49. Hola Leandro!!

    Este post explicado anteriormente te permite mantener la sesion activa aun cuando se cierra la pagina? , o sea funciona como en facebook? que la sesion nunca se cierra..

    Saludos y Gracias.

    ResponderEliminar
  50. hola Franco

    no si cierras la pagina el objeto session que esta en el servidor debe liberarse, ojo esto es Session como objeto del lado del sevidor no tiene que ver con la seguridad del sitio

    facebook no usa ninguna session en el servidor

    saludos

    ResponderEliminar
  51. Buenas tardes, puedes revisar los links de los proyectos de ejemplos que estan rotos, Gracias.

    ResponderEliminar
  52. Estimados, tengo la siguiente situación

    Tengo una aplicación la cual permitirá a usuarios hacer publicaciones de X tipo, esto podria tomar arto tiempo, asi que el tiempo de la sesión lo deje en varias horas.
    El tema es que en la portada tengo un contador de usuarios activos, utilizo los eventos session_start y end con variables estaticas para esto. Funciona, pero el valor de usuarios conectados no es real, ya que si un usuario entra aumenta el contador, pero si se desconecta 1 minuto despues el contador no cambiara hasta que termine el tiempo de sesion.

    Mi pregunta es, hay alguna forma de detectar que un usuario se desconecto aparte del session_end?
    Otra forma seria disminuir el tiempo de sesion solo a minutos, pero al ingresar una publicacion se cerrara la sesión. Hay forma de hacer algo parecido al ejemplo de esta pagina, pero que "refresque" la sesion? es decir cada 1 minuto preguntar si la sesion es nula, refrescarla?

    Saludos!

    ResponderEliminar
  53. hola Gabriel

    el tiempo de session lo dejaria en valores normales, el estandar es de 20 min

    despues podrias usar el

    window.onbeforeunload

    para detectar desde el cliente cuando se abandona el sitio o cierra el browser y enviar una invocacion ajax al servidor para que registre el cierre de la session
    en realidad en ese punto aun no se realiza el session_end, pero tu lo detectas cuando el usuario sale de la aplicacion

    saludos

    ResponderEliminar
  54. Hola Sr. Leandro, quisiera algo de orientación en la situación que tengo. Tengo el problema común de querer mantener una variable de session (ej. Session[""CurrentId]) más de 20 min, pero no duran mas de 10, y probe todo lo que dicen que se puede configurar en el web.config. Estoy empleando Visual Studio 2010 en una aplicación tipo Sitio Web con c# (lo menciono ya que el ejemplo dice que esta en Visual 2008) e implemente el ejemplo que dejo en este post "[ASP.NET] Mantener la Session Activa Indefinidamente" pero no me funciona allá, no se si no estoy teniendo en cuenta algo que debería saber, ya incluí las librerias en mi proyecto y todo, soy prácticamente nuevo en .net, le agradecería su ayuda grandemente.

    ResponderEliminar
  55. hola Erick

    porque no intentas crear un proyecto del tipo Web Application, asi este compilara a una dll, es mucho mas confiable que un Web Site

    ademas esto de la duracion de la session se genera cuando ejecutas desde el VS o cuando haces el deploy a un sitio en el IIS ?
    lo pregunto porque si es cuando ejecutas desde el VS puede ser este quien reinicie la session

    saludos

    ResponderEliminar
  56. Hola leandro
    si quiero definir lo para todas mis paginas este código debe de estar en el máster page ?

    ResponderEliminar
  57. hola Maicol8k

    exacto esa es la idea, si quieres generalizar la funcionalidad lo debes mover a un lugar comun

    en este caso el webmethod deberias ubicarlo en un aspx general que lo accedas desde todas las paginas, podrias crear una pagina sin nada en el html para ubicar el webmethod alli

    saludos

    ResponderEliminar
  58. Estimado Leandro, llegué a tu blog recomendado por una colega mía del trabajo, dice que siempre sabes la respuesta a todo así que aquí voy:

    Estoy desarrollando un sitio en .NET, en C#, hasta el momento no es muy complejo, es un masterpage que tiene un menú el cuál redirecciona a distintas ubicaciones de un directorio virtual que creé, en el que están alojadas múltiples páginas ASP clásicas que fueron el legado del antiguo ocupante de mi puesto de trabajo, además el masterpage anidará posteriormente las nuevas funcionalidades en .NET. El menú es generado a partir de una tabla de la base de datos, en esta tabla se encuentran todos los elementos del menú con sus respectivas categorías y rutas de acceso. Todo lo anterior funciona con aparente normalidad, salvo lo siguiente (y esto es lo confuso): al loguear y desloguear del sitio 5 veces, la sexta vez la master page no se carga y en su lugar arroja un NullReference Exception, aludiendo a una de las listas en las que cargo los menus desde la tabla de la base de datos, como si esta lista que intento cargar no estuviera instanciada (al menos eso es lo que entiendo) y ese no es el caso. La razón por la que pienso que esto tiene que ver con la Session y no con el codigo mismo del sitio es porque al levantarlo de manera local (en mi PC) mediante el servidor de ASP de Visual Studio 2010 este error no se produce nunca, no importa cuántas veces se loguee. Sin embargo, en ambiente de producción, al levantarse mediante IIS en la máquina server en la que estará alojado el sitio, se produce esto. He revisado las configuraciones del IIS durante estos días y leído harto material en internet pero aun no he dado con algo que me ayude a identificar el origen del problema. Lo confuso de la situación es que suceda desde el sexto login y no en el primero, y que en mi ambiente local no suceda en absoluto.

    Me disculpo de antemano si estoy preguntando en el lugar incorrecto, si es así dime donde debería hacerlo, pero realmente necesito tu ayuda, me estoy quedando ya sin recursos.

    Te agradezco de antemano por tu disposición. Saludos!!

    ResponderEliminar
    Respuestas
    1. Información adicional: para desloguear primero lo hice con mi propio botón logoff (que ejecuta las instrucciones Session["usuario"] = null; Session.Abandon(); y Response.Redirect("login.aspx"); ) y luego, para salir de dudas, lo hice cerrando el navegador cada vez limpiando las cookies. En ambos casos sucedió lo mismo.

      Eliminar
  59. hola,, necesito ayuda,,, aun no he podido hacer que mi session no caduque,,, podemos tener algún contacto, para explicarte lo que estoy haciendo,, y ver por que no me funciona, por favor,, mi correo es rocksy24@gmail.com

    ResponderEliminar
  60. mi estimado leando tutti una consulta segun tu proyecto de ejemplo de la caducidad de sessiones: como haria para ponerle un tiempo determinado como por ejemplo : 80 minutos y al momento de cerrarla las sessiones como lo cerraria las sessiones me podrias ayudar en eso

    ResponderEliminar
    Respuestas
    1. hola
      Es que no pones ningun tiempo determinado, sino que dejas el tiempo por defecto que define para la session, deberian ser 20 min, eso es lo que configuras en el timer de javascript
      Recuerda que sino hay actividad en el servidor por este lapso de tiempo la session se pierde, por eso mediante llamdas ajax se mantiene la actividad
      Si el usuario cierra el browser ya no habra actividad y la session se pierde
      saludos

      Eliminar
  61. Mi estimado leandro tutti he probado tu aplicativo en un proyecto nuevo que estoy haciendo y me sale error en el jquery en donde se encuentra el timer , me indica que no lo encuentra que podria hacer ayuda porfa

    ResponderEliminar
    Respuestas
    1. hola
      la verdad no sabria decirte con la info que proporcionas del problema, si te animas realiza la pregunta en el foro de msdn de asp.net
      en este podrias subir una imagen o mencionar cual es el error javascript que recibes
      para tomar el mensaje imagino usas el Developer Tools del browser, al cual accedes con F12 y usas la solapa Console
      saludos

      Eliminar
  62. Estimado Leandro

    Tengo mi web.config configurado para que la sesión dure 30 minutos pero el servidor al que subo mi aplicación lo ignora totalmente, y es más, hace durar las sesiones menos de UN MINUTO. ¿A qué se debe?

    ResponderEliminar
  63. hola
    Este tema se esta tratando en el foro de asp.net
    Duración de la Session
    saludos

    ResponderEliminar
  64. buenas noches leandro una pregunta si copio tucodigo que tienes en los ejemplos de mantener la sesion activa, me funcionara ami?

    ResponderEliminar
    Respuestas
    1. Depende, si tu desarrollo es asp.net y quieres lograr el mismo objetivo la tecnica deberia funcionar de la msima forma. por supuesto siempre algo hay que adaptar
      saludos

      Eliminar
  65. hola Leandro busco mantener la Sesión en una aplicación MVC 5, he visto también tus respuestas de el foro de MSDN

    ".... podrias haberlo realizado por medio de un action en el controller y usar el $.ajax de jquery ...en el articulo uso asp.net, pero solo cambiarias en el $.ajax para usar @Url.Action('action', 'controller') no necesitas de un handler"

    En el controller Realice los action

    public ActionResult KeepActiveSession()
    {
    if (HttpContext.Current.Session["datos"] != null)
    return true;
    else
    return false;
    }

    //Mantener Cerrar Session Activa
    public ActionResult SessionAbandon()
    {
    HttpContext.Current.Session.Remove("datos");
    }
    sale error en HttpContext.Current.Session

    y el JavaScript...

    // $.ajax({
    // type: "POST",
    // url: @url.action('KeepActiveSession','RegistroPeatonalController'),// ERROR INDICANDOME SUBRAYADO el action y el controller,
    // $.ajax({
    // type: "POST",
    // url: @url.action('SessionAbandon','RegistroPeatonalController'), //"ValidarSession1.aspx/SessionAbandon",
    // data: {},
    // contentType: "application/json; charset=utf-8",
    // dataType: "json",
    // async: true,

    sale error en @url.... podras observar que soy novato con web y MVC

    me podrias indicar como colocar bien el código??????

    ResponderEliminar
    Respuestas
    1. hola
      Recuerda que c# es keysensitive por lo tanto no es @url.action() sino que es @Url.Action() la U va en mayusculas y la A de action tambien
      Quizas es eso lo que este marcando el problema
      saludos

      Eliminar
    2. Así aplica a MVC5 ? código corregido ?

      Eliminar
  66. Hola Leonardo Tuttini, he leído casi todos los comentarios y respuestas y a pesar de eso no puedo encontrar alguna solución para mi problema.

    He desarrollado una aplicación que funcionar en diferentes ciudades y las sesiones se desaparecen o se pierden, ejemplo entran varios digamos 8 usuarios de cualquier sede y después de cierto tiempo entra 1 mas la aplicación de los demás usuarios queda en blando, OJO pero no de todos solo de algunos, a que me refiero con blanco; la pantalla principal del sistema se crea dinamicamente de acuerdo a los permisos por los usuario, usuario que esta en una sesión y cuando se desaparece ese dato pues no hay usuario y al no haber usuario el menú no se crea, y es por esa rozan que digo se queda en blanco

    ResponderEliminar
    Respuestas
    1. hola
      La verdad es bastante raro lo que plantas. Notas que esto sucede cuando ingresan usuario o cuando se cumple determinado tiempo? porque a veces puede configurarse en el IIS un tiempo de reiniciado del Application Pool, con lo cual perderias la info de la Session
      Cuando desaparece los datos de la session aun te encuentas autenticado? porque si pierdes estos datos como puede ser que no te redireccione el login ?
      saludos

      Eliminar
  67. hola leandro podrias ayudarme, quiero asignarle un valor a una variable de session por medio de javascript, como podria hacer esto

    ResponderEliminar
  68. Qué tal Leandro? Consulta respecto a ""Mantener la session activa"... Cómo podría aplicarse esta solución en un MasterPage, de manera que el timeout se controle en un sólo lugar de toda la aplicación? Muchas gracias. Saludos.

    ResponderEliminar
    Respuestas
    1. hola
      Si defines el WebMethod en un aspx independiente cuya funcionalidad solo sea mantener la session podrias accederlo desde todas las paginas (seria un aspx sin ningun html), por lo que el $.ajax podrias definirlo en la master
      saludos

      Eliminar
  69. Como hago para obtener un dato guardado en una sesion. ejemplo en la sesion empleado almaceno su documento, idinterno, nombre como hago para acceder al nombre

    ResponderEliminar
    Respuestas
    1. hola
      Si el dato esta en Session podrias usar:

      HttpContext.Current.Session

      dentro del webmethod definido como static
      saludos

      Eliminar
  70. Hola Leandro, veo que los fuentes ya no estan disponibles, el enlace aparece roto, que librerias de jquery son exactamente?

    ResponderEliminar
  71. Muy buen artículo.

    Pregunta: ¿Si tengo varias variables de sesión y estas tienen valor, debo realizar esta validación para cada una?

    ResponderEliminar
  72. Lenadro, Gusto en saludarte.

    Tengo dos aplicaciones MVC que usan FormAutentication , cuando ejecuto las dos al mismo tiempo y me logeo en la segunda , automaticamente me trunca la session de la primera, es de acotar que uso el mismo login en ambas

    ResponderEliminar
  73. Excelente aporte funciona perfectamente

    ResponderEliminar
  74. me manda este error al cargar la pagina

    El objeto no acepta la propiedad o el método 'everyTime'

    como le hago para solucionarlo ???

    ResponderEliminar
  75. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  76. Mantener el mismo tiempo de sesión que de caducidad de la cookie de autenticación?

    Tenemos la cookie de autenticación:


    authentication mode="Forms"

    forms loginUrl="~/Authentication/Login" name=".ADAuthCookie" timeout="2046" slidingExpiration="false" protection="All"



    Si es mantener la sesión activa indefinidamente, qué pasará con la caducidad de la cookie de autenticación ? Posible hacer que no caduque nunca ?

    Hasta que hagan el SignOut + Session.abandon + Cookies.Clear ?

    Como las cookies funcionan con cualquier petición HTTP imagino que sería fácil hacer que la cookie de autenticación se renueve en cada petición que se hace al servidor

    ResponderEliminar
  77. SessionState timeout y authentication timeout con el mismo valor. Pero hay temas que influyen como el reciclaje del AppPool.

    Sesion: In Proc
    Modo: Usar cookies
    ASP.NET_SessionId
    Tiempo de espera: 2040 minutos
    En el IIS 8.5, En las propiedades de la aplicación no vi nada al respecto de timeout.

    En appPool, qué valores das a shutdown worker process if idle y recycle worker process ?

    En mi AppPool aparece:
    Reciclaje
    1) Intervalos fijos
    Intervalos de tiempo regulares (en minutos): 1740
    Why is the IIS default app pool recycle set to 1740 minutes?
    https://weblogs.asp.net/owscott/why-is-the-iis-default-app-pool-recycle-set-to-1740-minutes

    En Process Model:

    "Process Model" section

    → "Idle Timeout Action" : TErminate, Suspend
    → "Idle Timeout" (default 20 minutes)
    → Identity: ApplicationPoolIdentity
    → ShutdownTimeLimit: (default 90 seconds)
    → StartupTimeLimit: (default 90 seconds)


    Under the "Recycle" section → "Regular Time Interval" (default 1740 minutes)

    Idle Time-out Action : Suspend setting
    Suspending is just freezes the process and it is much more efficient than the destroying the process.
    https://nimitsharma.wordpress.com/2014/10/03/introducing-iis-application-pool-idle-timeout-action/
    https://www.coreblox.com/blog/2014/12/iis7-application-pool-recycling-and-idle-time-out

    You need to set your application pool startMode to be AlwaysRunning:
    https://www.red-gate.com/simple-talk/blogs/speeding-up-your-application-with-the-iis-auto-start-feature/

    ResponderEliminar