Asp.net PostRequestHandlerExecute中的响应长度

Asp.net PostRequestHandlerExecute中的响应长度,asp.net,response,Asp.net,Response,我想知道发送给用户的响应在事件发生后的多长时间用于日志记录。asp.net中的HttpModule(在PostRequestHandlerExecute事件中)有什么方法可以做到这一点。不幸的是,HttpResponse.OutputStream是只写的,所以这不是很简单-任何查看输出流的Length属性的尝试都会引发异常 我见过的唯一解决方法是对响应对象应用一个过滤器,以便过滤器可以计算字节数 一个快速的谷歌搜索,它似乎接近我记忆中的实现。希望它有所帮助 context.PostRequest

我想知道发送给用户的响应在事件发生后的多长时间用于日志记录。asp.net中的HttpModule(在PostRequestHandlerExecute事件中)有什么方法可以做到这一点。

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

我见过的唯一解决方法是对
响应
对象应用一个过滤器,以便过滤器可以计算字节数

一个快速的谷歌搜索,它似乎接近我记忆中的实现。

希望它有所帮助

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);
    }
};
MyrStream类

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
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Web;
命名空间执行时间
{
公共类MyRewriterStream:流
{
#“Propiedades”地区
私人溪流(水槽);;
#端区
公共MyRewriterStream(System.IO.Stream)
{
_汇=流;
}
公共重写无效写入(字节[]缓冲区、整数偏移量、整数计数)
{
弦外之音;
outStr=UTF8Encoding.UTF8.GetString(缓冲区、偏移量、计数);
strPageSize=strPageSize+Outtr;
StringBuilder sb=新的StringBuilder(OutTR);
如果(sb.ToString().LastIndexOf(“”>0)
{
字符串HtmlResponse=“;//在这里放置新的HTML响应
sb.附录(HtmlResponse);
byteArray=Encoding.ASCII.GetBytes(sb.ToString());
_sink.Write(byteArray,0,byteArray.Length);
}
其他的
{
_写入(缓冲区、偏移量、计数);
}
}
公共覆盖无效刷新()
{
_下沉。冲洗();
}
#区域属性
公共覆盖布尔可读取
{
获取{return true;}
}
公共覆盖布尔搜索
{
获取{return true;}
}
公共覆盖布尔可写
{
获取{return true;}
}
//公共覆盖无效刷新()
//{
//_sink.Flush();
//}
公共覆盖长长度
{
获取{返回0;}
}
私人多头头寸;
公众优先多头仓位
{
获取{return\u position;}
设置{u位置=值;}
}
#端区
#区域方法
公共重写整型读取(字节[]缓冲区、整型偏移量、整型计数)
{
返回_sink.Read(缓冲区、偏移量、计数);
}
公共覆盖长寻道(长偏移,参见原始坐标系)
{
返回_sink.Seek(偏移,原点);
}
公共覆盖无效设置长度(长值)
{
_sink.SetLength(值);
}
公共覆盖无效关闭()
{
_sink.Close();
}
#端区
}
}