Как зафиксировать отметку времени отключения окна в классическом ASP

Мне нужно зафиксировать общее прошедшее время, которое пользователь проводит на странице в классическом ASP (.asp). Это не имеет НИЧЕГО общего с необходимостью профилирования страницы, чтобы узнать время выполнения логики страницы. Меня интересует только количество времени, которое каждый пользователь проводит на сайте и конкретно на определенной странице. Прошедшее время также необходимо зафиксировать, если на стороне клиента произошло неожиданное отключение.

Я знаю, что в ASP.net есть сторонние утилиты и инструменты для этого, но я изо всех сил пытаюсь найти что-то, что будет работать в классическом ASP. Я прочитал предложение о возможном использовании цикла для постоянного обновления базы данных последним временем во время отображения страницы, но похоже, что это может быть немного интенсивным чтением/записью?

Какие-либо предложения?


person Lana    schedule 13.05.2021    source источник
comment
Раньше для таймингов страницы активно использовали Softwing.Profiler component и даже создавали пользовательский класс, который использовал его для определения времени действий в сеансе. Очень полезный компонент COM.   -  person user692942    schedule 13.05.2021
comment
Пример использования здесь.   -  person user692942    schedule 14.05.2021


Ответы (1)


Вы всегда можете использовать команду Timer и сравнить время, чтобы получить разницу. Проблема заключается в том, что классический ASP является однонаправленным на стороне сервера, что означает, что он не имеет двустороннего соединения с клиентом. Обмен данными с сервером происходит только при загрузке или обновлении страницы. Вы можете включить некоторые параметры javascript, которые позволят выполнять некоторые транзакции без перезагрузки страницы. Метод, использующий базу данных для отслеживания времени, будет полезен, потому что каждый раз, когда вы перезагружаете страницу, Timer будет сбрасываться.

<% 'Variables
   dim StartTime, StopStop, HowLong
   'set the StartTime
   StartTime = Timer 
       'your function goes here
   'set the StopTime
   StopTime = Timer 'stops the timer
   'set HowLong to be equal to StopTime subtract Start Time
   HowLong = StopTime - StartTime
   'Display the results to screen
   Response.Write ("It took " & HowLong & " seconds to complete.")
%>

Теперь этот сценарий должен был показать вам, как вы можете отслеживать, сколько времени прошло. Я думаю, что объяснил ограничения вашей проблемы с ASP Classic только на стороне сервера, поэтому вам нужно будет использовать метод, подобный тому, который вы думали о том, где вы постоянно выводите эту переменную HowLong и сравниваете ее с базой данных.

И последнее, что следует учитывать: переход со страницы или обновление страницы вызовет повторный запуск сценария, поэтому вам нужно будет принять некоторые меры по отказоустойчивости, чтобы избежать нежелательных обратных сообщений или других осложнений, поскольку мы не знаем, что делает ваш сценарий. . Если вы дадите мне дополнительную информацию, я смогу дать больше советов, но, не видя, что делает ваш код, я надеюсь, что этого достаточно, чтобы указать вам правильное направление.

РЕДАКТИРОВАТЬ. Еще одна мысль: вы можете использовать объект Session для хранения данных между загрузками страницы. Вы можете использовать это, чтобы сравнить таймер с таймером в базе данных. Session объекты также защищены и не могут быть изменены пользователем вручную, поэтому это будет безопасный способ передачи данных между загрузками страниц. Вот пример кода о том, как сохранить переменную Session и извлечь из нее. Давайте представим, что мы используем оба скрипта одновременно, чтобы я мог передать и сохранить HowLong в переменную Session. Хотя вам потребуется база данных, поскольку она не является долговременным хранилищем, срок ее действия истечет через несколько минут, и вы можете указать, как долго они должны храниться, если вы хотите, чтобы они длились долгое время даже во время простоя. Теперь к коду.

<%  
'store into a session variable
HowLong = Session("HowLong")
'read from a session variable
Session("HowLong") = HowLong
%>

Надеюсь, что редактирование добавило дополнительный бит, который вам может понадобиться. Я думаю, что в основном просто объяснил процесс того, как делать то, что они говорили. Если вы включите метод Session, вы можете использовать его для хранения данных, поэтому вам нужно будет только записывать или читать из базы данных каждые несколько минут или около того.

OHH EDIT - я забыл упомянуть, что Timer вычисляется в секундах или сколько секунд прошло с даты в 80-х годах. Таким образом, хотя вы можете сравнивать даты и метки времени, чтобы получить время, если вы пытаетесь увидеть, как долго что-то началось и остановилось, Timer — это самый простой метод, не беспокоясь о типах данных или чем-то подобном. И последнее, что касается переменных сеанса: если вы закроете браузер, они перестанут работать. Я не думаю, что это относится к вкладкам, но любопытно узнать. Но если вы используете этот метод таймера, базы данных, сеанса, он может отслеживать, когда он запускается, но проблема заключается в том, чтобы определить точное время отключения без постоянных проверок базы данных. Это похоже на то, что вам лучше, возможно, использовать что-то в javascript или Asp.net, чтобы сделать это незамысловатым способом, но я знаю, что это не всегда возможно, но с предоставленной информацией я попытался предложить некоторые рекомендации, которые, надеюсь, помогло, но вы видите, что проблема в том, что он не может ничего обновить на сервере без ввода пользователя, и единственный вход - это закрытие окна пользователем, и это не то, что ASP обнаруживает напрямую, а с помощью переменной сеанса и постоянные проверки БД, вы могли бы собрать что-то вместе, что могло бы сработать.

person easleyfixed    schedule 14.05.2021
comment
Проблема с использованием Timer заключается в точности, поэтому компонент COM, такой как Softwing.Profiler, лучше подходит и может обрабатывать более точную синхронизацию. - person user692942; 14.05.2021
comment
Да, в этом проблема с моим ответом, мы точно не знаем, что они пытаются сделать, мы просто знаем, какая у них проблема. Возможно, для этого подойдет Timer, но хорошая мысль user692942! - person easleyfixed; 15.05.2021
comment
Спасибо за отличные предложения и подробности. Я посмотрю на функциональность таймера. Это может помочь. По сути, пользователь смотрит видео в классе, и общее время, потраченное на просмотр видео, должно быть рассчитано на кредитные часы. Итак, если по какой-то причине они теряют подключение к Интернету или загружаются по какой-либо другой причине, таймер должен остановиться в этот момент. Я очень ценю помощь! - person Lana; 15.05.2021
comment
@Lana Я не уверен, насколько полезным будет Timer(), поскольку минимум, который вы можете зафиксировать, - это секунды, тогда как большинство действий будут длиться миллисекунды, которые VBScript изначально не поддерживает, поэтому я в первую очередь предложил компонент COM. - person user692942; 15.05.2021
comment
Итак, если мне нужно только количественно определить прошедшее время в секундах, будет ли правильным выбором Timer? Кроме того, если пользователь внезапно потеряет подключение к Интернету и закроет свой браузер, не выходя из страницы корректно, сохранит ли Timer необходимое прошедшее время? Спасибо еще раз за помощь! - person Lana; 16.05.2021
comment
Еще одно уточнение... Я не пытаюсь рассчитать время выполнения какой-либо части логики. Только продолжительность времени, которое пользователь проводит на определенной странице. Спасибо еще раз за помощь! - person Lana; 17.05.2021
comment
Если вы читаете то, что я упомянул в моем ответе, у ASP classic есть ограничение, заключающееся в том, что он не может точно определить какую-либо обратную связь от пользователя после выполнения страницы, если только вы не свяжете ее с javascript или, может быть, даже с некоторыми умными процедурами mysql для делать подсчет за вас, но как вы ожидаете, что ваш скрипт сообщит базе данных или коду, что пользователь сделал? У меня есть идея .. где-то в видео он говорит вам код, который вы вводите в поле, чтобы отправить, когда вы закончите смотреть видео? Таким образом, вы получите готовое время .. может это просто сработает? Но без рандомизации дети быстро опубликуют это. - person easleyfixed; 19.05.2021
comment
Лана, я не ответил дальше, так как объяснил, что самая большая проблема во всем этом процессе заключается в неспособности единого направленного языка сценариев сообщить сценарию, что пользователь ушел. Единственный верный способ - это, возможно, у вас будет кнопка, которую они нажимают, когда они закончат, или метод, который я объяснил выше.. может быть, умело встроить части кода, которые они должны собрать вместе и отправить после просмотра, чтобы доказать, что они просмотрели все видео, затем добавьте код, чтобы проверить, не сделали ли они это слишком быстро.. просто перешли к частям кода.. что-то подобное может сработать, как вы думаете? - person easleyfixed; 21.05.2021
comment
Я имею в виду... никто не может доказать, что они его смотрели... они могли транслировать его и уйти... без каких-то хитрых двунаправленных скриптовых трюков. Итак, если речь идет о регистрации здесь, когда они щелкнули, чтобы начать смотреть это, и здесь, когда они щелкнули, чтобы прекратить просмотр, это можно отследить, и, МОЖЕТ БЫТЬ, некоторые тайм-ауты сеанса, чтобы доказать, что они не AFK, могут быть проверены, и МОЖЕТ БЫТЬ, что закрытие окна очистит переменную сеанса, и вы можете проверить это ... но это ваши лучшие варианты. Или, наконец, тест, который они проходят .. но я знаю это больше о подтверждении зарегистрированных часов. - person easleyfixed; 21.05.2021