HttpModule с фильтром - метод Writer вызывается дважды - PullRequest
1 голос
/ 11 декабря 2008

У меня есть 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) запускается ... это не то, чего я хочу, кто-нибудь знает, почему и / или как я могу заставить его работать (последовательно)? *

Ответы [ 2 ]

1 голос
/ 11 декабря 2008

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

См. Это для одного вида решения ...

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

Вместо responseStream.Write (data, 0, data.Length); попробуй responseStream.Write (data, 0, data.Length-1);

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

0 голосов
/ 11 декабря 2008

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

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

Конструктор PageFilter с именем

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

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

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

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

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

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

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

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

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

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

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

...