Как я мог вставить строку в ответный поток где-нибудь, я хочу?

Может быть простой способ сделать это, но я не вижу его...

Я создал простой Модуль Http, который запускает таймер на PreRequestHandler и останавливает таймер на PostRequestHandler для вычисления времени, которое он взял страницу для загрузки.

Я затем создаю некоторый простой HTML и пишу мои результаты в Ответ. Записать. Так как я делаю это в PostRequestHandler, он добавляет мои результаты после </html> тег. Это хорошо для тестирования, но мне нужно в сценарии, где страница должна проверить.

Я, может казаться, не выясняю, как я мог управлять объектом Ответа вставить мои результаты перед </body> тег. Ответ. Запись и Ответ. Вывод. Запись не имеет той гибкости, и я не мог видеть способ работать с Ответом как строка. Я пропускаю что-то легкое?

5
задан DM. 7 May 2010 в 19:19
поделиться

1 ответ

Чтобы сделать это, вам придется реализовать свой собственный объект потока и использовать его в качестве фильтра для вашего ответа.

Для примера:

public class TimerStream : Stream
{
    private Stream inner { get; set; }
    private StringBuilder   responseHtml;

    public TimerStream(Stream inputStream) { 
        inner = inputStream; 
        responseHtml = new StringBuilder();
        // Setup your timer
    }

    /* Filter overrides should pass through to inner, all but Write */
    public override void Write(byte[] buffer, int offset, int count)
    {
        string bufferedHtml = System.Text.UTF8Encoding.UTF8.GetString (buffer, offset, count);
        Regex endTag = new Regex ("</html>", RegexOptions.IgnoreCase);

        if (!endTag.IsMatch (bufferedHtml))
        {
            responseHtml.Append(bufferedHtml);
        }
        else
        {
            // insert timer html into buffer, then...
            responseHtml.Append (bufferedHtml);
            byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes (responseHtml.ToString ());            
            inner.Write (data, 0, data.Length);            
        }
    }
}

Затем, в вашем HttpModule, вы добавите это в BeginRequest:

// Change the Stream filter
HttpResponse response = context.Response;
response.Filter = new TimerStream(context.Response.Filter);
8
ответ дан 14 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: