Как я могу вставить строку в поток ответов, где я хочу? - PullRequest
5 голосов
/ 07 мая 2010

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

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

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

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

1 Ответ

8 голосов
/ 08 мая 2010

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

Для isntance:

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);
...