2010-05-07 10 views
5

Puede haber una manera fácil de hacer esto, pero no puedo verlo ...¿Cómo podría insertar una cadena en la secuencia de respuesta en cualquier lugar que desee?

he creado un módulo HTTP sencillo que inicia un temporizador en el PreRequestHandler y se detiene el temporizador del PostRequestHandler para calcular el tiempo que se tomó la página para cargar.

Luego creo un html simple y escribo mis resultados en Response.Write. Como hago esto en PostRequestHandler, agrego mis resultados después de la etiqueta </html>. Está bien para las pruebas, pero lo necesito en un escenario donde la página debe validar.

Parece que no puedo entender cómo podría manipular el objeto Response para insertar mis resultados antes de la etiqueta </body>. Response.Write y Response.Output.Write no tienen esa flexibilidad y no pude ver una forma de trabajar con la respuesta como una cadena. ¿Me estoy perdiendo algo fácil?

Respuesta

8

Para hacer esto, tendría que implementar su propio objeto de transmisión y usarlo como filtro para su respuesta.

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

Luego, en su HttpModule, deberá añadir esto a su BeginRequest:

// Change the Stream filter 
HttpResponse response = context.Response; 
response.Filter = new TimerStream(context.Response.Filter); 
+0

tiene un aspecto sólido. Voy a darle un giro. ¡Gracias! –

+0

No hay problema. Edité mi publicación porque estaba usando 'buffer' como un parámetro de entrada y una variable local, así que lo cambié. –

+0

Ok, intenté implementar esto y encontré algunos bloques de ruta ... al final de su método de "escritura" modificado que usted llama "responseStream.Write (...)" ¿de dónde obtiene el responseStream? Usted no lo pasa ni lo inicializa en ningún lado? –

Cuestiones relacionadas