2010-05-07 5 views
5

Il peut y avoir un moyen facile de faire cela, mais je ne peux pas le voir ...Comment pourrais-je insérer une chaîne dans le flux de réponse où je veux?

J'ai créé un module simple Http qui démarre une minuterie sur la PreRequestHandler et arrête le chronomètre sur le PostRequestHandler pour calculer le temps a pris la page à charger.

Je crée alors une simple html et écrire mes résultats à Response.Write. Depuis que je fais cela dans le PostRequestHandler il est d'ajouter mes résultats après la balise </html>. C'est bien pour les tests, mais j'ai besoin dans un scénario où la page doit valider.

Je ne peux pas à comprendre comment je pouvais manipuler l'objet de réponse à insérer mes résultats avant la balise </body>. Response.Write et Response.Output.Write n'ont pas cette flexibilité et je ne pouvais pas voir un moyen de travailler avec la réponse en tant que chaîne. Est-ce que je manque quelque chose de facile?

Répondre

8

Pour ce faire, vous auriez à mettre en œuvre votre propre objet de cours d'eau et l'utiliser comme un filtre pour votre réponse.

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

Ensuite, dans votre HttpModule, vous ajouteriez ceci à votre BeginRequest:

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

Attend solide. Je vais lui donner un tourbillon. Merci! –

+0

Pas de problème. J'ai édité mon post parce que j'utilisais 'buffer' comme paramètre d'entrée et une variable locale, donc je l'ai changé. –

+0

Ok, donc j'ai essayé de mettre en œuvre ce et a couru dans quelques rues de la route ... à la fin de votre surchargée « Write » méthode que vous appelez « responseStream.Write (...) », où en êtes-vous le responseStream de? Vous ne le transmettez pas ou ne l'initialisez nulle part? –

Questions connexes