To get at the bytes sent you can use the HttpResponse.Filter
property. As the MSDN docs say this property gets or sets a wrapping filter object that is used to modify the HTTP entity body before transmission.
You can create a new System.IO.Stream
that wraps the existing HttpResponse.Filter
stream and counts the bytes passed in to the Write
method before passing them on. For example:
public class ContentLengthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += OnBeginRequest;
context.EndRequest += OnEndRequest;
}
void OnBeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
application.Response.Filter = new ContentLengthFilter(application.Response.Filter);
}
void OnEndRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
var contentLengthFilter = (ContentLengthFilter) application.Response.Filter;
var contentLength = contentLengthFilter.BytesWritten;
}
public void Dispose()
{
}
}
public class ContentLengthFilter : Stream
{
private readonly Stream _responseFilter;
public int BytesWritten { get; set; }
public ContentLengthFilter(Stream responseFilter)
{
_responseFilter = responseFilter;
}
public override void Flush()
{
_responseFilter.Flush();
}
public override long Seek(long offset, SeekOrigin origin)
{
return _responseFilter.Seek(offset, origin);
}
public override void SetLength(long value)
{
_responseFilter.SetLength(value);
}
public override int Read(byte[] buffer, int offset, int count)
{
return _responseFilter.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
BytesWritten += count;
_responseFilter.Write(buffer, offset, count);
}
public override bool CanRead
{
get { return _responseFilter.CanRead; }
}
public override bool CanSeek
{
get { return _responseFilter.CanSeek; }
}
public override bool CanWrite
{
get { return _responseFilter.CanWrite; }
}
public override long Length
{
get { return _responseFilter.Length; }
}
public override long Position
{
get { return _responseFilter.Position; }
set { _responseFilter.Position = value; }
}
}