2009-06-30 26 views
8

Estoy escribiendo un programa que tiene un sistema de configuración ASP.NET y una aplicación Silverlight. La mayoría de los usuarios permanecerán en la página de Silverlight y no visitarán el sitio ASP.NET, excepto para iniciar sesión, etc.Prevención de un tiempo de espera de sesión de ASP.NET cuando se usa Silverlight

El problema es que necesito que la sesión permanezca activa para fines de autenticación, pero la sesión tendrá un tiempo de espera incluso si el usuario está utilizando las características de la aplicación Silverlight.

¿Alguna idea?

+0

¿Se puede usar un temporizador? – WowtaH

Respuesta

12

En la página que aloja el control silverlight, puede configurar un temporizador de JavaScript y hacer una llamada ajax a un controlador de Http (.ashx) cada 5 minutos para mantener viva la sesión. Asegúrese de que su clase Handler implemente IRequiresSessionState.

Recomiendo el controlador porque es más fácil controlar el texto de respuesta que se devuelve, y es más ligero que una página aspx.

También deberá configurar la caché de respuestas de manera adecuada para asegurarse de que el navegador realiza la llamada ajax cada vez.

ACTUALIZACIÓN

Aquí está el código de ejemplo para un HttpHandler

public class Ping : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("OK"); 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 

Entonces si utiliza jQuery, se puede poner esto en su página aspx anfitrión

setInterval(ping, 5000); 

function ping() { 
    $.get('/Ping.ashx'); 
} 

El intervalo está en milisegundos, por lo que mi muestra hará ping cada 5 segundos, es probable que desee que sea un número mayor. Fiddler es una gran herramienta para depurar llamadas ajax, si no lo usa, comience.

+0

¿Es más liviano que una página aspx casi en blanco? Soy un novato en ASP.NET/AJAX y parece que es más complicado. ¿Puedes proporcionar una muestra del archivo ashx que necesitaría usar? –

+0

He intentado esto, y el javascript no parece funcionar en IE8. Acabo de descargar la última versión de jQuery para este propósito. ¿Hay algo más que necesite el controlador/página? –

+0

No hay nada más que deba necesitar. Hay una gran herramienta llamada Fiddler2 que puede usar para ver el tráfico de la red y asegurarse de que se está realizando la llamada. Podría ser un problema de ruta, en cuyo caso el violinista reportaría un 404. Recomendaría usar esa herramienta para ver qué está sucediendo. De lo contrario, IE8 tiene buenas herramientas de depuración de JavaScript que también pueden acercarte. – NerdFury

0

De hecho, he encontrado un truco muy bueno que básicamente integra un iframe en la misma página que la aplicación silverlight. El iframe contiene una página web aspx que se actualiza cada (Session.Timeout - 1) minutos. Esto mantiene la sesión activa por el tiempo que la aplicación Silverlight esté abierta.

Para hacer esto:

crear una página asp.net llamado "KeepAlive.aspx". En la sección principal de esa página, añadir lo siguiente:

<meta id="MetaRefresh" http-equiv="refresh" content="18000;url=KeepAlive.aspx" runat="server" /> 

    <script language="javascript" type="text/javascript"> 
     window.status = "<%= WindowStatusText%>"; 
    </script> 

en el código detrás de archivo, añadir lo siguiente:

protected string WindowStatusText = ""; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      // Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter. 
      MetaRefresh.Attributes["content"] = Convert.ToString((Session.Timeout * 60) - 60) + ";url=KeepAlive.aspx?q=" + DateTime.Now.Ticks; 

      WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); 
     } 
    } 

Ahora, en la misma página que la aplicación Silverlight, añadir lo siguiente:

<iframe id="KeepAliveFrame" src="KeepAlive.aspx" frameborder="0" width="0" height="0" runat="server" /> 

¡Ahora la sesión de asp.net permanecerá activa mientras se usa la aplicación Silverlight!

+0

Desafortunadamente, parece que esto no funciona en IE8 (al menos). –

0

El enfoque ajax ping/HttpHandler es bueno, pero la función JQuery $ .get espera un resultado json y arroja un error de análisis de JavaScript.

Modifiqué Ping HttpHandler para devolver "{}" en lugar de "OK" y funcionó mejor.

+0

puede especificar el tipo de respuesta que desea obtener al usar $ .get – Omu

Cuestiones relacionadas