Сделать последний звонок в базу данных, когда пользователь покидает сайт (ASPX)? - PullRequest
4 голосов
/ 12 марта 2010

У меня есть система, настроенная для блокировки определенного содержимого в таблице базы данных, поэтому только один пользователь может редактировать это содержимое одновременно. Достаточно просто, и эта часть работает нормально. Но сейчас я нахожусь на пути к тому, как отправить запрос на «разблокировку» контента. У меня есть хранимая процедура для разблокировки контента, но как / где я бы назвал ее, когда пользователь просто закрывает свой браузер?

Ответы [ 6 ]

5 голосов
/ 12 марта 2010

Вы также не можете знать, когда пользователь выключает свой компьютер. Вы должны сделать это наоборот.

Требовать периодического обновления блокировки. Только веб-сайт будет делать периодическое обновление. Если пользователь прекращает пользоваться веб-сайтом, срок действия блокировки истекает.

В противном случае требуется, чтобы пользователь явно разблокировал содержимое. Другие пользователи, которые хотят редактировать контент, могут затем кричать на первого пользователя, когда они не могут выполнять свою работу. Не технологическое решение, но все же хорошее. Стыд работает.

1 голос
/ 12 марта 2010

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

  1. Состоянием сессии является InProc, например. добавьте что-то подобное в ваш Web.config

  2. Убедитесь, что вы настроили IIS так, чтобы не перезапускать рабочие процессы во время обычной работы (см., Например, этот пост ).

Edit: Непосредственно не отвечая на вопрос напрямую, но другим подходом было бы использование Оптимистического управления параллелизмом для рассматриваемых данных.

1 голос
/ 12 марта 2010

Лучшее, что вы можете сделать на самом деле, это добавить что-то в свой Session_End в вашем global.asax. К сожалению, это не сработает до истечения времени ожидания сеанса.

Когда пользователь нажимает «X» в своем браузере, нет никакой гарантии, что браузер отправит вам что-нибудь обратно.

0 голосов
/ 12 марта 2010

Я думаю, что ваша хранимая процедура может выполнять блокировку и разблокировку (используется с " Select @strNewMax As NewMax ") ...

Вот пример из системы, которую я имею:

Declare @strNewMax Char
Select @strNewMax = 'N'

BEGIN TRANSACTION

/* Lock only the rows for this Item ID, and hold those locks throughout the transaction. */
If @BidAmount > (Select Max(AB_Bid_AMT) from AuctionBid With(updlock, holdlock) Where AB_AI_ID = @AuctionItemId)
Begin
    Insert Into AuctionBid (AB_AI_ID, AB_Bid_AMT, AB_Emp_ID, AB_Entry_DTM)
    Select @AuctionItemId, @BidAmount, @EmployeeId, GetDate()
    Select @strNewMax = 'Y'
End

COMMIT TRANSACTION

Select @strNewMax As NewMax

Это вставит запись в качестве следующей наивысшей ставки, и все это при блокировке всей таблицы, поэтому никакие другие ставки не будут обрабатываться одновременно. Он вернет либо «Y», либо «N» в зависимости от того, сработал он или нет.

Может быть, вы можете взять это и настроить в соответствии с вашим приложением.

0 голосов
/ 12 марта 2010

При попытке покинуть страницу ответов stackoverflow появляется диалоговое окно «Вы уверены?». Возможно, во время события на странице, которое использует SO (или как это делает SO), вы можете отправить окончательный запрос с объектом XmlHttpRequest. Это не распространяется, если процесс браузера неожиданно закрывается (используйте для этого session_onend), но он по крайней мере отправит событие «Я закрыт» раньше

0 голосов
/ 12 марта 2010

Существует такое событие, как «пользователь закрывает браузер».

Тем не менее я могу придумать два обходных пути:

  • Используйте Javascript / Ajax, чтобы навсегда (скажем, каждые 10 секунд) позвоните метод на вашей странице. Дата и время Ваш последний запрос должен быть сохранен где-то. Теперь вы пишете окна сервис, который проверяет каждую секунду какой сеанс истек. выполнять ваше пользовательское действие там.
  • Используйте global.asax Session_End () -Событие. (не может использоваться с каждым SessionState, посмотрите, какие из них это можно использовать)
...