To get sent bytes, you can use the HttpResponse.Filter property. Because MSDN documents say that this property gets or sets the wrapping filter object, which is used to modify the body of the HTTP object before passing.
You can create a new System.IO.Stream that wraps the existing HttpResponse.Filter stream and counts the bytes passed to the Write method before passing them. 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; } } }
Daniel Richardson
source share