HttpModule с фильтром - метод Writer вызывается дважды

У меня есть HttpModule с фильтром (PageFilter), где метод Writer PageFilter вызывается дважды для каждого запроса страницы, к сожалению, не с тем же результатом.

Идея фильтра состоит в том, чтобы найти "" и вставить перед ним текст / скрипт. Я обнаружил кучу мелких ошибок (и исправил их), но эта ошибка обманывает меня ...

Конструктор og PageFilter вызывается один раз, но его метод записи вызывается дважды за запрос?

ниже содержимое PageFilter.Writer (которое запускается дважды)

string strBuffer = System.Text.UTF8Encoding.UTF8.GetString (buffer, offset, count); 

try 
{
    Regex eof = new Regex("</html>", RegexOptions.IgnoreCase);

    if (!eof.IsMatch(strBuffer))
    {
       //(1)
       responseHtml.Append(strBuffer);
    }
    else
    {
        //(2)
        responseHtml.Append (strBuffer);
        string  finalHtml = responseHtml.ToString ();
        Regex   re = null;

        re = new Regex ("</body>", RegexOptions.IgnoreCase);
        finalHtml = re.Replace(finalHtml, new MatchEvaluator(lastWebTrendsTagMatch));
        // Write the formatted HTML back
        byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes (finalHtml);

        responseStream.Write(data, 0, data.Length);       

       }
    }
    catch (Exception ex)
    {
       Logging.Logger(Logging.Level.Error, "Failed writing the HTML...", ex);
    }

В первый раз, когда метод запускает case (1), а во втором - case (2) ... это не то, чего я хочу, кто-нибудь знает, почему и / или как я могу заставить его работать (последовательно)?

11.12.2008 08:49:21
2 ОТВЕТА
РЕШЕНИЕ

Метод Write может вызываться несколько раз для одной страницы. Объект HttpWriter объединяет данные и затем записывает их в свой выходной поток. Каждый раз, когда HttpWriter отправляет порцию данных, вызывается метод Write вашего фильтра ответа.

Обратитесь к этому для одного вида решения ...

  1. HttpResponse.Filter написать несколько раз

Вместо responseStream.Write (data, 0, data.Length); try responseStream.Write (data, 0, data.Length-1);

Надеюсь, вы найдете это полезным.

1
11.12.2008 11:47:09
У вас еще нет доступа к ExpertExchange, но я посмотрю на ссылки
noesgard 11.12.2008 11:06:57
Это не платная ссылка. Подписка не требуется. Просто зайдите в
rajesh pillai 11.12.2008 11:17:39
Да, это так, нужно сначала запустить 7-дневную пробную версию, чтобы просмотреть решение и сделать это, требуя предоставления информации о кредитной карте. Я подумываю, все ли в порядке (у вас нет доступных кредитных карт в этом месте, поэтому нужно было бы собрать их ... только для проверки, если решения мне
noesgard 11.12.2008 11:29:49
Даже сейчас я не могу его найти. Я только что просмотрел это некоторое время назад. Удалить -1 из длины ... responseStream.Write (data, 0, data.Length-1); вместо длины; Это может быть другой случай, но подумал об этом. Я удалю этот ee URL, так как для этого требуется платная подписка сейчас ....
rajesh pillai 11.12.2008 11:46:42
изменение -1 не помогает - по-прежнему получает 2 записи на двух разных страницах
noesgard 11.12.2008 12:14:38

Эти «события» происходят во время запроса на 1 страницу:

isAspx = true og / _layouts / not found (я проверяю, что это файл .aspx и URL не содержит / _layouts /)

Вызван конструктор PageFilter

Метод писателя инициирован ...

eof (regex): (регулярное выражение, содержащее созданный для сопоставления)

! eof.IsMatch (strBuffer): (не соответствует регулярному выражению)

Метод писателя инициирован ... (во второй раз вызывающий писатель)

eof (regex): (регулярное выражение, содержащее созданный для сопоставления)

Инициировано регулярное выражение (соответствует регулярному выражению)

re (regex): (нашел тег body, который мне нужен для вставки моего скрипта)

ScriptInclude = true (я нашел ключ web.config, сообщающий моему приложению, что оно должно включать скрипт)

Используется сценарий для США (я использовал версию сценария для США, также основанную на ключе веб-конфигурации)

Проблема заключается в том, что при моем развертывании dev программа записи запускается дважды, заканчивая приведенной выше последовательностью и включением сценария. В моем тестовом развертывании писатель запускается дважды и в конечном итоге НЕ включает сценарий ...

Я хотел бы избежать вызова Writer дважды, но больше хотел бы, чтобы скрипт был включен в тестовое развертывание

0
11.12.2008 12:29:24