using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Web; namespace TestWebApplication { public class ResponseSniffModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.PreRequestHandlerExecute += context_PreRequestHandlerExecute; context.PreSendRequestContent += context_PreSendRequestContent; } void context_PreRequestHandlerExecute(object sender, EventArgs e) { var application = sender as HttpApplication; var context = application.Context; var response = context.Response; // Add a filter to capture response stream response.Filter = new ResponseSniffer(response.Filter); } void context_PreSendRequestContent(object sender, EventArgs e) { var application = sender as HttpApplication; var context = application.Context; var response = context.Response; var filter = response.Filter as ResponseSniffer; if (filter != null) { var reader = new StreamReader(new MemoryStream(filter.RecordStream.GetBuffer())); var source = reader.ReadToEnd(); } } } public class ResponseSniffer : Stream { private readonly Stream ResponseStream; public MemoryStream RecordStream { get; set; } #region Implements of Stream public override bool CanRead { get { return ResponseStream.CanRead; } } public override bool CanSeek { get { return ResponseStream.CanSeek; } } public override bool CanWrite { get { return ResponseStream.CanWrite; } } public override void Flush() { ResponseStream.Flush(); } public override long Length { get { return ResponseStream.Length; } } public override long Position { get { return ResponseStream.Position; } set { ResponseStream.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return ResponseStream.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return Seek(offset, origin); } public override void SetLength(long value) { ResponseStream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { RecordStream.Write(buffer, offset, count); ResponseStream.Write(buffer, offset, count); } #endregion public ResponseSniffer(Stream stream) { RecordStream = new MemoryStream(); ResponseStream = stream; } } }