2010-06-24 4 views
0

Je veux savoir exactement combien de temps la réponse envoyée à l'utilisateur a été, après coup, à des fins de consignation. Est-il possible de le faire à partir d'un HttpModule dans asp.net (dans l'événement PostRequestHandlerExecute).Longueur de réponse dans PostRequestHandlerExecute

Répondre

1

Malheureusement, HttpResponse.OutputStream est écriture seule, donc ce n'est pas très simple - toute tentative de regarder la propriété Length du flux de sortie jetteront une exception.

La seule solution à ce que j'ai jamais vu est en appliquant un filtre à l'objet Response, de sorte que le filtre peut compter les octets.

Une recherche rapide sur Google landed me here, ce qui semble proche de l'implémentation dont je me souviens.

1

le souhaitent Aide

context.PostRequestHandlerExecute += delegate(object sender, EventArgs e) 
{ 
    HttpContext httpContext = ((HttpApplication)sender).Context; 
    HttpResponse response = httpContext.Response; 
    // Don't interfere with non-HTML responses 
    if (response.ContentType == "text/html") 
    { 
     response.Filter = new MyRewriterStream(response.Filter); 
    } 
}; 

MyRewriterStream Classe

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Web; 

namespace ExecutionTime 
{ 
    public class MyRewriterStream:Stream 
    { 
     #region "Propiedades" 

     private Stream _sink; 

     #endregion 
     public MyRewriterStream(System.IO.Stream stream) 
     { 

      _sink = stream; 
     } 
     public override void Write(byte[] buffer, int offset, int count) 
     { 
      string outStr; 
      outStr = UTF8Encoding.UTF8.GetString(buffer, offset, count); 
      strPageSize = strPageSize + outStr; 
      StringBuilder sb = new StringBuilder(outStr); 

      if (sb.ToString().LastIndexOf("</html>") > 0) 
      { 
       string HtmlResponse = "";//HERE PUT YOUR NEW HTML RESPONSE 
       sb.AppendLine(HtmlResponse); 
       byteArray = Encoding.ASCII.GetBytes(sb.ToString()); 
       _sink.Write(byteArray, 0, byteArray.Length); 
      } 
      else 
      { 
       _sink.Write(buffer, offset, count); 
      } 

     } 

     public override void Flush() 
     { 
      _sink.Flush(); 
     } 


     #region Properites 

     public override bool CanRead 
     { 
      get { return true; } 
     } 

     public override bool CanSeek 
     { 
      get { return true; } 
     } 

     public override bool CanWrite 
     { 
      get { return true; } 
     } 

     //public override void Flush() 
     //{ 
     // _sink.Flush(); 
     //} 

     public override long Length 
     { 
      get { return 0; } 
     } 

     private long _position; 
     public override long Position 
     { 
      get { return _position; } 
      set { _position = value; } 
     } 

     #endregion 

     #region Methods 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      return _sink.Read(buffer, offset, count); 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      return _sink.Seek(offset, origin); 
     } 

     public override void SetLength(long value) 
     { 
      _sink.SetLength(value); 
     } 

     public override void Close() 
     { 
      _sink.Close(); 
     } 
     #endregion 
    } 
} 
Questions connexes