代码之家  ›  专栏  ›  技术社区  ›  aepheus

PostRequestHandlerExecute中的响应长度

  •  0
  • aepheus  · 技术社区  · 15 年前

    我想知道发送给用户的响应在事件发生后究竟是用于日志记录的多长时间。是否可以从ASP.NET中的httpmodule(在PostRequestHandlerExecute事件中)执行此操作。

    2 回复  |  直到 7 年前
        1
  •  1
  •   womp    15 年前

    不幸的是, HttpResponse.OutputStream 只写 ,所以这不是很简单-任何尝试查看 Length 输出流的属性将引发异常。

    我见过的唯一解决方案是对 Response 对象,以便筛选器可以计算字节数。

    快速的谷歌搜索 landed me here 这似乎接近我记得的实现。

        2
  •  1
  •   JohnLBevan    7 年前

    希望它帮助

    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类

    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
        }
    }
    
    推荐文章