Таймер для тестувальної системи на ASP.NET

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Суть така: є сторінка на якій користувач проходить тест. Для проходження тесту виділяється певний час. Необхідно зробити так щоб після закінчення часу користувача редеректило на іншу сторінку. Цікавить як це можна зробити саме на серверній стороні. Пробував виrористовувати System.Timers.Timer

private System.Timers.Timer timer;

protected void Page_Init(object sender, EventArgs e)
    {
        timer = new System.Timers.Timer(TimePerQuiz);
        timer.Elapsed += TimerElapsed;
    }

protected void Page_Load(object sender, EventArgs e)
    {
        timer.Start();
    }

private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        HttpContext.Current.Response.Redirect("QuizResult.aspx", true);
    }

але цей код не працюватиме бо в TimeElapsed HttpContext буде null.

Хто програмував подібну річ або знає як це робиться прошу відписати.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Что нужно делать зависит от целей, но в целом я поддержу другого анонима...
Ключевая цель, как я понимаю — защититься от попыток пользователя обмануть систему. Для этого главная проверка должна быть неподконктрольна пользователю, т.е. работать на сервере. Кстати, запускать для этого отдельный поток — самоубийство. Такое решение абсолютно не масштабируемое. Достаточно просто сохранить на сервере время старта (или ожидаемого финиша) привязанное к сессии и проверять его. Если пользователь отсылает ответы когда время превышено — шлём ответ с внятным сообщение об ошибке. По-моему, это и есть стандартное решение.
Остальное — плюшки UI, которые улучшают юзабилити. И здесь по-моему, javascript — самое простое решение: спокойно javascript’ом делать обратный отсчёт вообще без обращений к серверу. Этот же скрипт рисует правильный UI, когда время истекло (например redirect). При болшом желании можно пытаться синхронизироваться с сервером, но этом, по-моему, себе дороже будет. Вероятно, нужно только продумать небольшой запас на серверной стороне для тех, кто захочет отправить ответ на последней секунде.

Единственный бонус meta refresh в том, что о нём знают меньше людей и меньше людей его будут пытаться отключить, в отличие от javascript’а (который у меня, например, по умолчанию отключён для всех сайтов). Но, повторюсь, не смотря на это, главная проверка от махинаций должна быть на сервере.

Странное какое-то у вас упорное желание делать эту задачу на сервере. Это как звонить в Америку, чтоб узнать который сейчас час в Украине.

Описанные вами требования (если вы конечно же не упустили ничего лишнего, что в корне меняет ситуацию) реализуются на клиенте при помощи Javascript. Ничего больше для этого не нужно.

Роман, а зачем редиректить?
Можно сделать такой вариант. Подсчет и отрисовка времени на клиенте с js, но время считать и на сервере.

Если юзер хитроумный и заблочит клиентский скрипт и превысив допустимое время нажмет что-то вроде «Получить результат», сервер ему даст отбой, даже с указанием на сколько превышено время.

2Аноним. Так впринципі ви все правильно зрозуміли.
1) є таймер який на клієні малюється javascript-ом
2) На серевері я запускаю додатковий потік в якому значення таймера зберігається в сесійній змінній. Щоб при
рефреші на клієнті відображалось актуальне значення таймера
3) Коли таймер дойде до 0 то сервер мав би редіректнути користувача на нову сторінку

Оцей третій пункт мене цікавить найбільше. В цьому джерелі пропонують таці самі рішення як озвучувалися вище. Проте це все можна обійти. Ясно що можна кожен раз при постбеку чи рефреші перевіряти стан сесійної змінної в якій зберігається стан таймера іт.д. Просто мене цікавило чи є якесь стандартне вирішення тої проблеми.

В догонку: замечу, что решение с meta refresh не может быть единственной защитой, да и с Javascript — то же, ибо оба легко обходятся с помощью, например, плагинов к Firefox RefreshBlocker и NoScript. Т.е. где-то таки должна быть серверная проверка

2Роман
По-моему, тут есть много споров из-за неясности. Не могли бы Вы формализовать требования. Как я понимаю, требования выглядят так (поправьте, если я ошибаюсь):
1) Есть таймер отмеряющий время T
2) На клиентской стороне в браузере мы не исполняем никакой код для этих целей
3) По прошествию времени T мы хотим чтобы браузер автоматиески показал другую страницу
Если это так, задание сложное. Откуда браузеру знать, что прошло время T. Всё, что он делает — отрисовывает ваш HTML, который сгенерировал сервер. Сервер не знает, как «достать» клиента, после того как соединение закрыто (как минимум, клиент элементарно может быть offline в это время). Единственный способ который я вижу — как-то применить meta refresh.

А вообще похоже, что более разумно несколько поменять требования.

Офігеть))

Ну якщо він так хоче на сервері таймер:)

На нашей системе тестирования, используется JS. Его код инициализируется в PageLoad и хранится в сессии.
Что бы при рефреше или постбэке возвращалось актуальное значение таймера.
Но и JS можно обмануть, просто отрубив его в броузере или выполнить свой скрипт на странице.
Хотя вся система тестирования логируется, и можно найти хаки, но кому это надо рыться в логах больше чем это надо.
Когда можно просто грамотно обезопасить систему.
Ну и еще, без JS думаю ты никак не редиректнешь со страницы.
Хотя наверно можно как-то извратиться, и посылать с сервера частичный PostBack.

Вообщем если кто-то найдет решения, просим код в студию)

На нашей системе тестирования, используется JS. Его код инициализируется в PageLoad и хранится в сессии.
Что бы при рефреше или постбэке возвращалось актуальное значение таймера.
Но и JS можно обмануть, просто отрубив его в броузере или выполнить свой скрипт на странице.
Хотя вся система тестирования логируется, и можно найти хаки, но кому это надо рыться в логах больше чем это надо.
Когда можно просто грамотно обезопасить систему.
Ну и еще, без JS думаю ты никак не редиректнешь со страницы.
Хотя наверно можно как-то извратиться, и посылать с сервера частичный PostBack.

Вообщем если кто-то найдет решения, просим код в студию)


Про AJAX чули?:)
Задаєш в жаваскрипті щоб кожну секунду відправлявся на сервер запит, а на сервері є handler, який ці запити обробляє.
Або ж і правда, зробити флешкою:)

Офігеть))

Підозрюю, що JavaScript Comet, AJAX Push, Long Polling чи Web Sockets, а також різноманітні message queue можуть стати у пригоді.

Про AJAX не тільки чув, а й часто використовую його.
Але ніколи б не додумався викоритсовувати для таймера AJAX) Як на мене щоб кожної секунди на сервер відправляти ajax запит і то всьо помножитти на кількість користувачів які одночасно проходять тест, то це зовсім нерозумно...

2 Хтось: Javascript само собою можна використати, просто цікавило чи можна використати якийсь механізм шоб це робилось на сервері. Мається на увазі власне редирект користувача ініційований не джавасріптом, а сервером...

Про AJAX чули?:)
Задаєш в жаваскрипті щоб кожну секунду відправлявся на сервер запит, а на сервері є handler, який ці запити обробляє.

Або ж і правда, зробити флешкою:)

сделать флешкой и не парится. в HTTP протоколе возможности посылать уведомления с сервера на клиент нету., а все воркэраунды на основе джаваскрипта не красивы.

ну так можна через javascript... чи вам так не підходить?

Иван Мазепов можете навести якийсь приклад або пояснити детільніше?

2PomAH4uK можеш пояснити чому ніяк?

А есть какой-нибудь пример?, т.к. у меня тоже подобная проблема.

Треба написати окремий.ashx (handler), який буде в окремому потоку запускати таймер та надавати через асинхронні запити інформацію про стан таймеру.

Підписатись на коментарі