Шаблоны AJAX в ASP.NET - Шаблон времени ожидания
ОГЛАВЛЕНИЕ
Шаблон времени ожидания
Одним из крупнейших преимуществ AJAX является возможность применения обновлений страницы в реальном времени. Однако обновления в реальном времени могут стать серьезной опасностью для приложения в случае злоупотребления ими. Представьте себе случай, в котором пользователь отображает постоянно обновляющуюся страницу, каждые несколько секунд запрашивающую сервер, чтобы обновить то или иное содержимое. Предположим, что пользователь оставляет ее на несколько часов, не отключая обозреватель. Как следствие, страница продолжает отправлять запросы, создавая значительную и бесполезную нагрузку на сервер.
Как можно определить, что сеанс клиента истек? На сервере существует время ожидания сеанса, но в AJAX имеет значение также сеанс клиента. Чтобы обнаружить завершение сеанса клиента, необходимо проверить, производил ли пользователь какие-либо действия вроде щелчков и нажатий в течении определенного периода времени. Отслеживание активности клавиатуры и мыши может требовать много ресурсов; облегченный и более простой подход, основанный на таймерах, обычно более эффективен.
Чтобы обнаружить завершение сеанса при помощи таймера, установите таймер клиента, истекающий через установленное число секунд (или, что более вероятно, минут), который останавливает текущую задачу и выводит окно предупреждения. Если пользователь отвечает на запрос, обработка возобновляется как обычно.
На рис. 5 показан фрагменты кода JavaScript, иллюстрирующий суть шаблона времени ожидания. Образец страницы внедряет часы. Часы добываются с помощью элемента управления Label («Метка») в UpdatePanel, который периодически обновляется элементом управления Timer, вот так:
Рис. 5 Применение времени ожидания сеанса клиента
<script type="text/javascript">
var timer = null;
function pageLoad()
{
if (timer === null)
{
timer = new Samples.TaskTimer(5000, stopTask);
timer.start();
}
}
function pageUnload()
{
if (timer != null)
timer.stop();
}
function stopTask()
{
// Stop the clock
var clock = $find("<%= Timer1.ClientID%>");
clock._stopTimer();
AskIfTheUserWantsToContinue();
}
function AskIfTheUserWantsToContinue()
{
// Ask if the user wants to continue
var answer = window.confirm(
"Is it OK to continue with the clock?");
if (answer)
{
// Restart the task
var clock = $find("<%= Timer1.ClientID%>");
clock._startTimer();
// Restart our own timeout engine
if (timer !== null)
timer.start();
return;
}
}
</script>
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToLongTimeString();
}
Часы представляют собой ресурсоемкую задачу, которая может затопить сервер запросами. Идея в том, чтобы установить таймер, периодически запрашивающий пользователя, действительно ли он желает продолжать работать с часами. Код времени ожидания сперва останавливает часы и затем отображает окно сообщения. В зависимости от ответа пользователя часы перезапускаются.
Код использует функцию $find для обнаружения компонента AJAX для ASP.NET – в данном случае это будет объектная модель клиента, принадлежащая серверному элементу управления ASP.NET Timer («Таймер»). На рис. 6 показана страница в действии со всплывающим окном, запрашивающим пользователя, можно ли продолжать.
Рис. 6 Запрос пользователя, можно ли продолжать
Дино Эспозито (Dino Esposito) – автор книги Programming ASP.NET 3.5 Core Reference («Справочник по основам программирования в среде ASP.NET 3.5»). Проживая в Италии, Дино часто выступает на различных отраслевых мероприятиях по всему миру.