送信されたバイトを取得するには、HttpResponse.Filter
プロパティを使用できます。MSDN のドキュメントによると、このプロパティは、送信前に HTTP エンティティ本体を変更するために使用されるラッピング フィルター オブジェクトを取得または設定します。
既存のストリームSystem.IO.Stream
をラップする new を作成し、メソッドに渡されるバイト数をカウントしてから渡すことができます。例えば:HttpResponse.Filter
Write
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; }
}
}