Я пытаюсь создать прокси, который будет обслуживать запросы на внутренний сайт (скрывая источник), но в то же время проверять пакеты и асинхронно обрабатывать их.
Например. скажем, все вызовы SOAP на http://www.foo.com будут направляться на http://192.168.1.1, и при этом храниться в БД для постанализа. Внутренний сервер — это черный ящик, поэтому что-то менять на нем — не в тему.
Во всяком случае, я настроил ARR с обратным прокси, сделал фильтр перезаписи URL с подстановочными знаками, все работает без нареканий. Затем я попытался добавить управляемый HttpModule, написанный на C#, и подключился к Application_BeginRequest и Application_EndRequest. Я могу получить доступ к заголовкам запросов, заголовкам ответов по конечному запросу (пул приложений находится в интегрированном режиме) и даже могу прочитать содержимое ответа из выходного потока, установив фильтр в Response.Filter, который кэширует все записи в дополнительном потоке памяти.
Проблема в том, что в тот момент, когда я пытаюсь прочитать (внутри обработчика модуля BeginRequest) входной поток из запроса, ARR остается некоторое время и выдает
Ошибка HTTP 502.3 — Bad Gateway Время ожидания операции истекло Код ошибки обработчика ApplicationRequestRoutingHandler 0x80072ee2
Так что время истекло.
Глядя на отслеживание неудачных запросов, я вижу:
MODULE_SET_RESPONSE_ERROR_STATUS Предупреждение ModuleName="ApplicationRequestRouting", Notification="EXECUTE_REQUEST_HANDLER", HttpStatus="502", HttpReason="Bad Gateway", HttpSubStatus="3", ErrorCode="2147954402", ConfigExceptionInfo="" SET_RESPONSE_ERROR_DESCRIPTION Warning ErrorDescription="Операция время вышло"
Теперь любые подобные сообщения в сети не помогли, так как это не ошибка тайм-аута (прокси имеет настройку 120 секунд, ответы страницы менее 100 мс), а момент, когда я комментирую код обработчика, который пытается прочитать данные формы или данные InputStream, все работает как шарм.
Даже если я установлю позицию входного потока на 0 после его чтения, я все равно получаю тайм-ауты. Если я прочитаю входной поток в EndRequest, он получит 0 байтов, даже если это был запрос POST. (что явно неправильно)
Есть ли у ARR ошибка в том, что я пытаюсь прочитать входной поток до того, как он попытается перенаправить его?
Что использовалось: Windows Server 2008 R2 IIS 7.5 ARR v2 .Net Framework 3.5 модуль
Идеи? Спасибо /Космин