2009-06-30 8 views
8

Sto scrivendo un programma che ha sia un sistema di configurazione ASP.NET che un'applicazione Silverlight. La maggior parte degli utenti rimarrà sulla pagina Silverlight e non visiterà il sito ASP.NET eccetto per l'accesso, ecc.Prevenzione di un timeout sessione ASP.NET quando si utilizza Silverlight

Il problema è che ho bisogno che la sessione rimanga attiva a scopo di autenticazione, ma la sessione verrà interrotta anche se il l'utente sta utilizzando le funzionalità dell'app silverlight.

Qualche idea?

+0

È possibile utilizzare un timer? – WowtaH

risposta

12

Nella pagina che ospita il controllo Silverlight, è possibile impostare un timer javascript e effettuare una chiamata ajax a un gestore HTTP (.ashx) ogni 5 minuti per mantenere viva la sessione. Assicurati che la classe Handler implementi lo IRequiresSessionState.

Raccomando il gestore perché è più semplice controllare il testo di risposta restituito ed è più leggero di una pagina aspx.

Sarà inoltre necessario impostare correttamente la cache di risposta per assicurarsi che il browser effettui la chiamata ajax ogni volta.

UPDATE

Ecco il codice di esempio per 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; } 
    } 
} 

Quindi se si utilizza jQuery, si può mettere questo sul vostro host aspx pagina

setInterval(ping, 5000); 

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

L'intervallo è in millisecondi, quindi il mio campione eseguirà un ping ogni 5 secondi, probabilmente vorrai che sia un numero più grande. Fiddler è un ottimo strumento per il debug di chiamate ajax, se non lo usi, inizia.

+0

È più leggero di una pagina aspx quasi vuota? Sono una specie di novizio di ASP.NET/AJAX e sembra che sia più complicato. Puoi fornire un esempio del file ashx che avrei bisogno di usare? –

+0

Ho provato questo, e il javascript non sembra funzionare in IE8. Ho appena scaricato l'ultima versione di jQuery per questo scopo. C'è qualcos'altro che il gestore/pagina ha bisogno? –

+0

Non c'è nient'altro di cui avresti bisogno. C'è un ottimo strumento chiamato Fiddler2 che puoi usare per guardare il traffico di rete e assicurarti che la chiamata sia fatta. Potrebbe trattarsi di un problema di percorso, nel qual caso il violinista avrebbe segnalato un 404. Raccomanderei di usare quello strumento per vedere cosa sta succedendo. In caso contrario, IE8 ha buoni strumenti di debug di JavaScript che potrebbero anche avvicinarti. – NerdFury

0

In realtà ho trovato un hack piuttosto interessante che essenzialmente incorpora un iframe nella stessa pagina dell'applicazione Silverlight. L'iframe contiene una pagina Web di aspx che si aggiorna automaticamente ogni (Session.Timeout - 1) minuti. Ciò mantiene viva la sessione per tutto il tempo in cui l'app Silverlight è aperta.

Per fare questo:

Creare una pagina asp.net chiamata "KeepAlive.aspx". Nella sezione di testa di quella pagina, aggiungere questo:

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

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

nel codice dietro file, aggiungere questo:

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(); 
     } 
    } 

Ora, sulla stessa pagina come l'applicazione Silverlight, aggiungere questo:

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

Ora la sessione di asp.net rimarrà attiva mentre l'app silverlight è in uso!

+0

Sfortunatamente, sembra che questo non funzioni in IE8 (almeno). –

0

L'approccio ajax ping/HttpHandler è buono, ma la funzione JQuery $ .get prevede un risultato JSON e genera un errore di analisi javascript.

Ho modificato Ping HttpHandler per restituire "{}" anziché "OK" e questo ha funzionato meglio.

+0

puoi specificare il tipo di risposta che vuoi ottenere quando usi $ .get – Omu