Классический ASP Request.Form не работает при использовании интегрированного конвейера

У меня большая корпорация. веб-сайт со смешанным классическим asp и asp.net, в настоящее время размещенный на сервере Win 2003, IIS 6.

Мне нужно изменить вывод всех страниц с некоторыми изменениями HTML, независимо от мира, из которого они происходят. Часть asp действительно старая и плохо структурированная, поэтому я не могу использовать какие-либо "общие включения", чтобы применить все необходимые изменения. Наконец, некоторые страницы asp выводят код из нескольких объектов OCX/COM... Мы уже планируем полное переписывание / миграцию в.net, но, к сожалению, это долгосрочный проект, и я не могу быстро его выполнить.

Поэтому я думал (и тестировал) перенести его на Win 2008 R2, IIS 7.5 и воспользоваться преимуществами интегрированного конвейерного режима, в котором я могу изменить все выходные данные, используя http-модуль.net. Все работает нормально: я могу правильно "внедрить" html-код в страницы, отображаемые через asp и asp.net, но у меня возникают проблемы, когда классические страницы asp собираются обрабатывать данные формы, отправленные по почте (x-www-form-urlencoded) модули.

Кажется, что в классическом asp вообще отсутствует объект Request.Form при использовании режима интегрированного конвейера, который выдает ошибку "80004005" при каждом использовании; Request.QueryString вместо этого он работает правильно.

Я бы не стал переключаться обратно в режим Classic Pipeline, так как потерял бы преимущества изменения страниц, отображаемых в классическом ASP. Использование фильтра Isapi - это кошмар, и я не буду идти в этом направлении.

Кто-нибудь знает какой-нибудь обходной путь для получения Request.Form, работающего для классического asp, когда активен режим Integrated Pipeline, или любой способ изменить окончательный вывод страницы с использованием классического asp при использовании классического конвейера, чтобы я мог изменить его с помощью кода.net перед отправкой это к браузеру?

Спасибо за любую помощь, Squiffy

РЕДАКТИРОВАТЬ: К сожалению, мы никогда не нашли решение этой проблемы. Между тем, мы полностью перестроили сайт с нуля, используя много современных решений (ууу!). Спасибо всем за вашу помощь!

3 ответа

Я думаю, это потому, что вы используете Request.Form в модуле http. Согласно моим экспериментам Request.Form работает в asp в интегрированном режиме, если только вы не обращаетесь к нему из модуля до обработки кода asp. В этом случае есть предложение использовать HttpServerUtility.TransferRequest на форумах IIS. Ты можешь использовать

  const string dontTransferKey = "DONT_TRANSFER_MODULE";
    if (HttpContext.Current.Request.Headers[dontTransferKey] != null)
        return;

    ...............all your http module logic. use Request.Form...................

    HttpContext.Current.Request.Headers.Add(dontTransferKey, "true");
    HttpContext.Current.Server.TransferRequest(HttpContext.Current.Request.Url.AbsolutePath, true);

У этого решения есть несколько недостатков: если вы используете более одного http-модуля, вы должны быть уверены, что они являются идемпотентными. И это может быть очень сложно в случае сторонних модулей.

Просто поместив его туда, вы тоже пробовали "Request.Item()"?

Фактическая причина ошибки чтения Request.Form в Classic ASP с вашим интегрированным модулем mode + заключается в том, что Classic ASP может обрабатывать чтение / обработку двоичных данных POST только один раз.

Это означает, что при втором чтении выдается ошибка, несмотря ни на что.

В документации метода BinaryRead упоминается поведение:

Метод BinaryRead используется для чтения необработанных данных, отправленных клиентом как часть запроса POST. Этот метод используется для низкоуровневого доступа к этим данным, в отличие, например, от использования коллекции Request.Form для просмотра данных формы, отправленных в запросе POST. После использования BinaryRead ссылка на любую переменную в коллекции Request.Form вызывает ошибку. И наоборот, после ссылки на переменную в коллекции Request.Form использование BinaryWrite приведет к ошибке.

Я часто видел это на практике.

В этом случае http-модуль.NET может считывать данные POST, что приводит к ошибке Classic ASP Request.Form или наоборот.

Не уверен, что вы используете Glimpse, но если вы используете, я просто потратил день, пытаясь выяснить, почему вдруг мои Классические ASP Request.Forms перестали работать. Короче говоря: я прокомментировал следующую строку в конфигурации glimpse под:

  <add type="Glimpse.Core.Policy.AjaxPolicy, Glimpse.Core" />

Добавление этого обратно к игнорируемым типам решило мою проблему. Теперь я могу получить доступ к Request.Form/Request("поле") в Classic ASP. Кстати, я использую Интегрированный режим.

Надеюсь, это сэкономит кому-то время, которое я провел сегодня...

Другие вопросы по тегам