Предотвращение Тайм-аута Сессии ASP.NET при использовании Silverlight

Кажется, что если вы связываете родителя с ребенком, устанавливая родителя на ребенка, а не наоборот, это работает без сбоев.

Так что если вы сделаете:

[child setParent:parent]

вместо

[parent setChildObects:child]

Это должно работать, по крайней мере, работает на iOS 7 и не было никаких проблем с отношениями.

8
задан Russell Patterson 30 June 2009 в 21:11
поделиться

3 ответа

На странице, на которой размещен элемент управления silverlight, вы можете настроить таймер javascript и выполнять вызов ajax обработчику Http (.ashx) каждые 5 минут, чтобы сохранить сессия жива. Убедитесь, что ваш класс Handler реализует IRequiresSessionState .

Я рекомендую Handler, потому что с ним легче контролировать возвращаемый текст ответа, и он более легкий, чем страница aspx.

Вы также необходимо правильно настроить кеш ответов, чтобы браузер каждый раз выполнял вызов ajax.

UPDATE

Вот пример кода для 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; }
    }
}

Затем, если вы используете jQuery, вы можете поместить это на страницу aspx вашего хоста

setInterval(ping, 5000);

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

. Интервал указан в миллисекундах, поэтому мой образец будет пинговать каждые 5 секунд, вы, вероятно, захотите, чтобы это было большее число. Fiddler - отличный инструмент для отладки вызовов ajax, если вы его не используете, начните.

12
ответ дан 5 December 2019 в 14:06
поделиться

На самом деле я нашел довольно интересный прием, который, по сути, встраивает iframe на ту же страницу, что и приложение silverlight. Iframe содержит веб-страницу aspx, которая обновляется каждые (Session.Timeout - 1) минут. Это поддерживает сеанс до тех пор, пока открыто приложение silverlight.

Для этого:

Создайте страницу asp.net под названием «KeepAlive.aspx». В разделе заголовка этой страницы добавьте следующее:

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

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

В код файла добавьте следующее:

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

Теперь на той же странице, что и приложение silverlight, добавьте следующее:

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

Теперь сеанс asp.net будет остаются активными, пока используется приложение silverlight!

0
ответ дан 5 December 2019 в 14:06
поделиться

Подход ajax ping / HttpHandler хорош, но функция JQuery $ .get ожидает результат json и выдает ошибку синтаксического анализа javascript.

Я изменил Ping HttpHandler, чтобы он возвращал "{ } "вместо" ОК ", и это сработало лучше.

0
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: