代码之家  ›  专栏  ›  技术社区  ›  DM.

我如何在任何我想要的地方向响应流中插入一个字符串?

  •  5
  • DM.  · 技术社区  · 14 年前

    可能有一个简单的方法,但我看不到…

    我创建了一个简单的HTTP模块,它在prerequesthandler上启动一个计时器,并在postrequesthandler上停止计时器,以计算页面加载所用的时间。

    然后我创建一些简单的HTML并将结果写入response.write。由于我在PostRequestHandler中执行此操作,它将在 </html> 标签。这对于测试来说很好,但是我需要在一个需要验证页面的场景中。

    我似乎不知道如何操作响应对象,以便在 </body> 标签。response.write和response.output.write没有那么大的灵活性,我看不出将响应作为字符串来处理的方法。我错过了什么容易的事吗?

    1 回复  |  直到 14 年前
        1
  •  8
  •   Joseph Yaduvanshi    14 年前

    要做到这一点,您必须实现自己的流对象,并将其用作响应的过滤器。

    为:

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