Наконец-то я нашел решение своей проблемы.
Пользовательский модуль, который я реализовал, использует асинхронные обработчики:
context.AddOnBeginRequestAsync(
new BeginEventHandler(BeginBeginRequest),
new EndEventHandler(EndBeginRequest)
);
В случае, когда мой модуль не обрабатывает запрос, обработчик события begin завершает запрос и не имеет к нему никакого отношения. Еще пару дней назад я прыгал в другой поток, чтобы обработать эти запросы в методе Begin, и недавно я исправил это так, что я переключался в другой поток, только если мой модуль должен обработать запрос. Теперь это вызвало проблему. Очевидно, IIS не нравится, что я завершаю свою обработку в том же потоке.
Так что теперь я снова прыгаю в другую ветку - несмотря ни на что. IIS доволен, и мое приложение больше не зависает.
Мне все еще нужно исследовать и выяснить, почему это происходит - или это действительно ошибка в IIS, или то, как я возвращаю IAsyncResult из метода BeginBeginRequest. Но сейчас я знаю, что должен обработать этот запрос в другом потоке.