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] |
Leandro...
ResponderEliminartené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...
hola
ResponderEliminarun 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
Hola Leo.. como hago para indicarle al sistema que solo espere 60 minutos la sesión
EliminarTienes 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
EliminarHola buen post.
ResponderEliminarUna 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
hola Josengan
ResponderEliminarLo 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
Hola, lo que pasa que ya busque como invocar a la funcio pero ahora quiero tener el identity insertado en la pagina. para modificarlo.
ResponderEliminarImagina 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
hola Josengan
ResponderEliminarCuando 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
Hola gracias por la ayuda.
ResponderEliminarUna 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.
Hola Leandro.
ResponderEliminarHay 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?
hola Josengan
ResponderEliminarNo 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
hola Josengan
ResponderEliminardesplegar 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
Gracias Leandro.
ResponderEliminarHe 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
hola Falconetic
ResponderEliminaren 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
Buenas de nuevo Leandro
ResponderEliminarLlevo 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
hola Adri
ResponderEliminarno 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
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
ResponderEliminarrecargitas@gmail.com
hola rafa pim
ResponderEliminarque 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
Hola Leandro,
ResponderEliminarEstupendo 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
hola Julio
ResponderEliminarla 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
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.
ResponderEliminarhola Tse
ResponderEliminarpero 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
Hola Leandro, muy bueno el post, muchas gracias y muchas gracias por todas las ayudas q nos dejas, me han servido muchisimo.
ResponderEliminarProbé 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.
hola fercho
ResponderEliminarcuando 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
Hola Leandro, gracias por la pronta respuesta.
ResponderEliminarestoy 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.
hola
ResponderEliminara 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
hola Leandro,
ResponderEliminarMuchas 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.
hola
ResponderEliminarquizas debarias ahber aplicado lo que comento aqui
[ASP.NET] Master Page - Referencia relativa a elementos de la página
saludos
Buen dia.
ResponderEliminarLeandro, 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?
Hola Leandro.
ResponderEliminarTengo 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?
hola Cristian
ResponderEliminaralgo 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
Hola Leandro, Gracias por ayudarnos con todo tu conocimiento.
ResponderEliminarMe 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.
hola Jheison
ResponderEliminarpero 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
Gracias por tu respuesta Leandro.
ResponderEliminarSi tengo el codigo completo del sitio web.
Que debo hacer?
hola Jheison
ResponderEliminarsi 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
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?..
ResponderEliminarYo soy novato en esto, siempre he realizado sitios de prueba pero nunca he realizado una publicación.
Nuevamente gracias por tu ayuda!
hola Jheison
ResponderEliminar[ASP.NET] Web Service - Publicar en IIS Windows 7
alli explico como usarias la opcion de publicacion del VS
saludos
Hola Leandro ! Excelente post, tengo una pregunta, por medio de jquery, cómo puedo comprobar si existe una conexión a internet?
ResponderEliminarhola Ana
ResponderEliminarque 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
Hola Leandro,estoy utilizando $.ajax , y he seguido tu consejo, me ayudó bastante muchas gracias. Saludos!
ResponderEliminarhola leandro :
ResponderEliminarMuy 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...
hola sebastianv
ResponderEliminaren el articulo lo menciono, se usa para no tener que consultar por una determinada key en la session
saludos
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"?
ResponderEliminarhola Jonathan
ResponderEliminara que llamas seccion privada ? por la verdad no entendi el planteo del problema
saludos
Leandro:
ResponderEliminarComo 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
hola M@FuMo
ResponderEliminardesde 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
y para mantener la sesion indefinidamente pero desde mvc? es lo mismo?
ResponderEliminarhola juan
ResponderEliminaren 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
Hola Leandro, sabes me gustaria que me ayudaras con un problemita que traego.
ResponderEliminarmira 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.
ha se me paso decir que estoy con archivos aspx desde vb studio 2012 con visual basic trabajando.
ResponderEliminarhola isova
ResponderEliminarpero 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
Hola Leandro!!
ResponderEliminarEste 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.
hola Franco
ResponderEliminarno 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
Buenas tardes, puedes revisar los links de los proyectos de ejemplos que estan rotos, Gracias.
ResponderEliminarEstimados, tengo la siguiente situación
ResponderEliminarTengo 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!
hola Gabriel
ResponderEliminarel 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
Funciona! Gracias!
ResponderEliminarHola 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.
ResponderEliminarhola Erick
ResponderEliminarporque 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
Hola leandro
ResponderEliminarsi quiero definir lo para todas mis paginas este código debe de estar en el máster page ?
hola Maicol8k
ResponderEliminarexacto 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
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:
ResponderEliminarEstoy 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!!
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.
Eliminarhola,, 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
ResponderEliminarmi 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
ResponderEliminarhola
EliminarEs 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
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
ResponderEliminarhola
Eliminarla 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
Estimado Leandro
ResponderEliminarTengo 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?
hola
ResponderEliminarEste tema se esta tratando en el foro de asp.net
Duración de la Session
saludos
buenas noches leandro una pregunta si copio tucodigo que tienes en los ejemplos de mantener la sesion activa, me funcionara ami?
ResponderEliminarDepende, 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
Eliminarsaludos
hola Leandro busco mantener la Sesión en una aplicación MVC 5, he visto también tus respuestas de el foro de MSDN
ResponderEliminar".... 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??????
hola
EliminarRecuerda 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
Así aplica a MVC5 ? código corregido ?
EliminarHola 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.
ResponderEliminarHe 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
hola
EliminarLa 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
hola leandro podrias ayudarme, quiero asignarle un valor a una variable de session por medio de javascript, como podria hacer esto
ResponderEliminarQué 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.
ResponderEliminarhola
EliminarSi 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
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
ResponderEliminarhola
EliminarSi el dato esta en Session podrias usar:
HttpContext.Current.Session
dentro del webmethod definido como static
saludos
Hola Leandro, veo que los fuentes ya no estan disponibles, el enlace aparece roto, que librerias de jquery son exactamente?
ResponderEliminarMuy buen artículo.
ResponderEliminarPregunta: ¿Si tengo varias variables de sesión y estas tienen valor, debo realizar esta validación para cada una?
Lenadro, Gusto en saludarte.
ResponderEliminarTengo 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
Lo solucionaste?
EliminarExcelente aporte funciona perfectamente
ResponderEliminarme manda este error al cargar la pagina
ResponderEliminarEl objeto no acepta la propiedad o el método 'everyTime'
como le hago para solucionarlo ???
Este comentario ha sido eliminado por el autor.
ResponderEliminarMantener el mismo tiempo de sesión que de caducidad de la cookie de autenticación?
ResponderEliminarTenemos 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
SessionState timeout y authentication timeout con el mismo valor. Pero hay temas que influyen como el reciclaje del AppPool.
ResponderEliminarSesion: 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/