2009-06-30 12 views
8

Piszę program, który ma zarówno system konfiguracji ASP.NET, jak i aplikację Silverlight. Większość użytkowników pozostanie na stronie Silverlight i nie będzie odwiedzać witryny ASP.NET, z wyjątkiem logowania itp.Zapobieganie przekroczeniu limitu czasu sesji ASP.NET podczas korzystania z Silverlight

Problem polega na tym, że sesja pozostanie aktywna do celów uwierzytelniania, ale sesja zostanie przekroczona, nawet jeśli użytkownik korzysta z funkcji aplikacji silverlight.

Wszelkie pomysły?

+0

Czy możesz użyć timera? – WowtaH

Odpowiedz

12

Na stronie obsługującej kontrolkę silverlight można ustawić timer języka javascript i wykonywać wywołania ajax do handler'a Http (.ashx) co 5 minut, aby utrzymać sesję przy życiu. Upewnij się, że twoja klasa Handler implementuje IRequiresSessionState.

Polecam Handler, ponieważ łatwiej jest kontrolować zwracany tekst odpowiedzi i jest on lżejszy niż strona aspx.

Będziesz także musiał odpowiednio ustawić pamięć podręczną odpowiedzi, aby upewnić się, że przeglądarka wywołuje wywołanie ajax za każdym razem.

UPDATE

Oto przykładowy kod dla 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; } 
    } 
} 

Następnie, jeśli używasz jQuery, można umieścić to na aspx strony przyjmującej

setInterval(ping, 5000); 

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

przedziale jest w milisekundach, więc moja próbka będzie pingować co 5 sekund, prawdopodobnie chcesz, aby była większa. Fiddler to świetne narzędzie do debugowania wywołań ajaxowych, jeśli go nie używasz, uruchom.

+0

To jest bardziej lekkie niż prawie puste strony aspx? Jestem nowicjuszem w ASP.NET/AJAX i wygląda na to, że jest bardziej skomplikowany. Czy możesz podać próbkę pliku ashx, który powinienem użyć? –

+0

Próbowałem tego i javascript wydaje się nie działać w IE8. Właśnie pobrałem najnowszą wersję jQuery do tego celu. Czy jest coś jeszcze, czego potrzebuje handler/page? –

+0

Nic więcej nie powinno ci być potrzebne. Istnieje wspaniałe narzędzie o nazwie Fiddler2, którego możesz używać do oglądania ruchu sieciowego i sprawdzania, czy jest wykonywane połączenie. Może to być problem ze ścieżką, w którym to przypadku skrzypek zgłosiłby 404. Polecam używanie tego narzędzia, aby zobaczyć, co się dzieje. W przeciwnym razie IE8 ma dobre narzędzia do debugowania javascript, które również mogą Cię przybliżyć. – NerdFury

0

Znalazłem całkiem fajny hack, który zasadniczo osadza element iframe na tej samej stronie co aplikacja silverlight. Element iframe zawiera stronę internetową aspx, która odświeża się co (Session.Timeout - 1) minut. Dzięki temu sesja pozostaje żywa przez długi czas, gdy aplikacja silverlight jest otwarta.

Aby to zrobić:

Załóż stronę ASP.NET o nazwie "KeepAlive.aspx". W sekcji head tej strony, dodaj to:

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

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

w kodzie za plik, dodać to:

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

Teraz, po tej samej stronie co aplikacji Silverlight, dodać to:

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

Teraz sesja asp.net pozostanie aktywna, gdy używana jest aplikacja silverlight!

+0

Niestety, wygląda na to, że to nie działa w IE8 (przynajmniej). –

0

Podejście ajax ping/HttpHandler jest dobre, ale funkcja JQuery $ .get oczekuje wyniku json i generuje błąd analizy javascript.

Zmodyfikowałem Ping HttpHandler, aby przywrócić "{}" zamiast "OK" i działało to lepiej.

+0

możesz określić typ odpowiedzi, którą chcesz uzyskać, używając $ .get – Omu

Powiązane problemy