Отслеживание открытых страниц с ASP.Net - PullRequest
2 голосов
/ 29 августа 2010

Я уверен, что этот вопрос уже задавался, но на самом деле я его не вижу.

Используя asp.net и c #, как отслеживать открытые / закрытые страницы?

Я перепробовал все виды вещей, в том числе:

  • изменение файла приложения global.asax / операций начала / окончания сеанса
  • настройка деструктора страницы для отчетак приложению
  • статические переменные (которые сохраняются глобально, а не в сеансе на основе сеанса)
  • javascript window.onload и window.onbeforeunload обработчики событий

Этобыл образовательным, но до сих пор не найдено никакого реального решения.

Причина, по которой я хочу это сделать, состоит в том, чтобы предотвратить одновременное изменение одной и той же таблицы несколькими пользователями.То есть у меня есть список ссылок на таблицы, и когда пользователь щелкает, чтобы изменить таблицу, я хотел бы установить эту ссылку заблокированной, чтобы НЕТ ПОЛЬЗОВАТЕЛЬ мог затем изменить эту таблицу.Если пользователь закрывает страницу модификации таблицы, у меня нет возможности разблокировать ссылку на эту таблицу.

Спасибо за чтение и за помощь.

Ответы [ 3 ]

2 голосов
/ 29 августа 2010

Вам не нужно беспокоиться об отслеживании открытых или закрытых страниц.Как только веб-страница отображается IIS, она становится «закрытой».

Что вам нужно сделать, так это защитить двух пользователей, одновременно обновляющих вашу таблицу, используя блокировки ... Например:

    using (Mutex m = new Mutex(false, "Global\\TheNameOfTheMutex")) 
    {
            // If you want to wait for 5 seconds for other page to finish, 
            // you can do m.WaitOne(TimeSpan.FromSeconds(5),false)

            if (!m.WaitOne(TimeSpan.Zero, false))
                Response.Write("Another Page is updating database.");
            else
                UpdateDatabase();                              

    } 

Что делает этот фрагмент кода,не разрешать какой-либо другой веб-странице вызывать метод UpdateDatabase, пока другая страница уже выполняет вызов UpdateDatabase. Поэтому две страницы не могут вызывать updatedatabase в одно и то же точное время.UpdateDatabase ПОСЛЕ того, как первый вызов завершен, поэтому вы должны убедиться, что ваш метод UpdateDatabase имеет правильные проверки, т.е.он не позволяет обновлять устаревшие данные.

1 голос
/ 29 августа 2010

Вы не должны использовать запросы страниц для блокировки таблиц базы данных. Это не будет работать хорошо по многим причинам. Каждый запрос создает новый объект страницы, и существует несколько контекстов приложения, которые могут находиться в нескольких потоках / процессах и т. Д. Любой из них может упасть с лица земли в любой момент времени.

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

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

Например. См. http://www.webcheatsheet.com/php/record_locking_in_web_applications.php Это для PHP, но концепция та же.

1 голос
/ 29 августа 2010

Я думаю, что вы идете не так по этому поводу ...

Вы действительно должны управлять своим параллелизмом через бизнес-уровень / db и не полагаться на интерфейс, потому что люди могут и найдут способ обойти то, что вы реализуете.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...