none
Запретить одновременный вызов метода веб-службы RRS feed

  • Вопрос

  • Имею веб-службу (не путать с придурковатым 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
    Модератор