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