Принуждение веб-службы asmx к обработке запросов по одному

Я отлаживаю веб-службу ASMX, которая получает «всплески» запросов. т. е. вполне вероятно, что веб-служба получит 100 асинхронных запросов в течение примерно 1 или 2 секунд. Кажется, что обработка каждого запроса занимает около секунды (это ожидаемо, и я в порядке с такой производительностью). Однако важно то, что каждый запрос обрабатывается последовательно и не выполняется параллельная обработка. Я не хочу какой-либо параллельной обработки запросов из-за внешних компонентов, вызываемых веб-службой. Есть ли способ заставить веб-службу обрабатывать каждый ответ только последовательно?

Я видел атрибут maxconnection в machine.config, но, похоже, он работает только для исходящих соединений, где я хочу ограничить входящие соединения.

Обратите внимание, что рефакторинг в WCF на данный момент невозможен.

Мы используем IIS6 на Win2003.


person Alex    schedule 01.05.2009    source источник
comment
@Alex: Вам помог какой-нибудь из этих ответов? Вы должны голосовать за те, которые помогли, чтобы люди, читающие этот вопрос позже, знали, какие ответы являются полезными.   -  person John Saunders    schedule 20.08.2009
comment
Не совсем. Я ищу подробности о том, как IIS6 ведет себя (или может быть вынужден вести себя) в этом сценарии. Программные решения мне в данном случае не подходят, и я не могу перейти на IIS 7.   -  person Alex    schedule 20.08.2009
comment
IIS не имеет ничего общего с проблемой. Он не задействован, за исключением передачи запросов в ASP.NET.   -  person John Saunders    schedule 20.08.2009
comment
Итак, учитывая, что изменение поведения IIS6 не может решить вашу проблему, возможно ли, что один из этих ответов решит вашу проблему?   -  person John Saunders    schedule 22.08.2009


Ответы (3)


Возможно, вам следует ставить запросы в очередь и обрабатывать их один за другим?

Это может привести к тому, что клиенты будут опрашивать результаты (если они им вообще нужны), но вы получите последовательный конвейер, который вам нужен...

person Kieron    schedule 01.05.2009
comment
Все запросы являются асинхронными от клиента. Я рассматривал создание класса очередей на стороне веб-службы, но подумал, что IIS должен иметь некоторый внутренний буфер для кэширования запросов, поэтому я не хотел (плохо) заново изобретать колесо. - person Alex; 01.05.2009
comment
Я бы предложил посмотреть msmq и обработать очередь через рабочий поток/процесс. - person Preet Sangha; 01.05.2009

Что я делал в прошлом, так это просто помещал оператор блокировки вокруг любого доступа к внешнему ресурсу, который я использовал. В моем случае это был фрагмент неуправляемого кода, который утверждал, что он потокобезопасен, но на самом деле уничтожал кучу библиотеки времени выполнения C, если к нему обращались более чем из одного потока одновременно.

person John Saunders    schedule 01.06.2009

В IIS7 вы можете установить ограничение разрешенных подключений к веб-сайту. Вы можете использовать IIS7?

person Community    schedule 01.05.2009
comment
И что произойдет с входящими соединениями, которые приходят, пока максимальное количество соединений активно? Будут ли они поставлены в очередь IIS или им будет отказано? Я проверю, разрешено ли нам использовать IIS7. - person Alex; 01.05.2009
comment
Из того, что я обнаружил, дополнительные запросы ставятся в очередь в очереди http.sys до тех пор, пока не будет свободного подключения. Однако это может привести к тайм-ауту клиентского приложения. - person ; 01.05.2009
comment
Хорошо, это звучит как именно то поведение, которое я желаю. Это поведение относится только к IIS 7 или оно происходит и в 6? Я могу контролировать время ожидания клиента, так что это не проблема. Кстати, где вы нашли эту информацию? - person Alex; 01.05.2009
comment
Я не уверен в IIS6, у меня нет ничего, что я мог бы проверить. Как? Ну, я сначала посмотрел в IIS, потому что вспомнил, что видел это. Чем немного Google дал мне ответ, что происходит с неограниченными соединениями. - person ; 01.05.2009