Лучший отвечающий
Запретить одновременный вызов метода веб-службы

Вопрос
-
Имею веб-службу (не путать с придурковатым WCF), на ней веб-метод. Хочу чтобы этот веб-метод исполнялся в единственном экземпляре. Возможны варианты:
1. Метод выполняется, второй HTTP-запрос ждёт завершение первого и потом продолжает работу
2. Метод выполняется в приложении, которое завершается и ждёт завершения всех своих запросов, второй вызов передан новому приложению сайта и HTTP-вызов в новом приложении ждёт окончания первого вызова в старом (вот тут самое интересное, так как первый вызов может в любой момент на ладан дыхнуть и быть завершён принудительно и щё делать с освобождением мютекса?)
3. Каким-то образом случилось, что HTTP-вызов в новом приложении запустился раньше HTTP-вызова в старом приложении, которое завершается. Таким образом старое приложение тоже должно дождаться завершения вызова и потом только продолжить выполнение (вот тут тоже интересное, этот вызов может быть завершён принудительно)
4. Ну и совсем фантастический случай, хотя такое я наблюдал - когда стартует третий экземпляр приложения, а первые два IIS завершает.
Кароче, думаю мне поможет мютекс, я прав или достаточно старого доброго lock(typeof(ляляля))?
- Изменено Radu2000 12 марта 2013 г. 8:30 ISS
11 марта 2013 г. 18:32
Ответы
-
Хочу понять, что вам нужно и предложить обходное решение. Не надо обижаться, :). Просто как вы выразились в "придурковатом WCF" это делается очень просто:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
Поэтому эту проблему можно решить очень просто. Не могу понять чем WCF вам не угодил? А вот сама природа обычных веб-служб этого не позволит. При каждом запросе используется другой рабочий поток и контекст запроса. Если очень сильно захотеть, можно реализовать это на уровне обработчика HTTP-данных (реализовав свой), установив его свойство IsReusable = false. Метод службы идёт после обработчика.
- Предложено в качестве ответа YatajgaModerator 15 марта 2013 г. 13:44
- Помечено в качестве ответа Abolmasov DmitryModerator 19 марта 2013 г. 9:30
12 марта 2013 г. 8:06Модератор
Все ответы
-
А откуда такая затея, зачем вам это?11 марта 2013 г. 18:38Модератор
-
а можно я не буду отвечать на такой вопрос?
12 марта 2013 г. 6:21 -
Хочу понять, что вам нужно и предложить обходное решение. Не надо обижаться, :). Просто как вы выразились в "придурковатом WCF" это делается очень просто:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
Поэтому эту проблему можно решить очень просто. Не могу понять чем WCF вам не угодил? А вот сама природа обычных веб-служб этого не позволит. При каждом запросе используется другой рабочий поток и контекст запроса. Если очень сильно захотеть, можно реализовать это на уровне обработчика HTTP-данных (реализовав свой), установив его свойство IsReusable = false. Метод службы идёт после обработчика.
- Предложено в качестве ответа YatajgaModerator 15 марта 2013 г. 13:44
- Помечено в качестве ответа Abolmasov DmitryModerator 19 марта 2013 г. 9:30
12 марта 2013 г. 8:06Модератор