如何最好地捕获由aspx页面呈现的HTML(在我的实例中,用于日志记录)?
我不想使用Response.Write写回页面,因为它弄乱了我的网站布局。
使用Response.OutputStream或Response.Output的流会导致ArgumentException({System.ArgumentException:Stream不可读)。
解决方法
好的问题,我不得不尝试看看我是否可以创建一个HttpModule来做你正在描述的内容。
我没有任何运气尝试从责任心读取,但使用ResponseFilter给了我一种方法来捕获的内容。
以下代码似乎工作得很好,我想也许你可以使用代码作为基础。但请记住,这只是我快速投掷的东西,没有以任何方式进行测试。所以不要在任何生产环境中使用它,没有适当的检查/测试等等。随意评论它;)
- public class ResponseLoggerModule : IHttpModule
- {
- private class ResponseCaptureStream : Stream
- {
- private readonly Stream _streamToCapture;
- private readonly Encoding _responseEncoding;
- private string _streamContent;
- public string StreamContent
- {
- get { return _streamContent; }
- private set
- {
- _streamContent = value;
- }
- }
- public ResponseCaptureStream(Stream streamToCapture,Encoding responseEncoding)
- {
- _responseEncoding = responseEncoding;
- _streamToCapture = streamToCapture;
- }
- public override bool CanRead
- {
- get { return _streamToCapture.CanRead; }
- }
- public override bool CanSeek
- {
- get { return _streamToCapture.CanSeek; }
- }
- public override bool CanWrite
- {
- get { return _streamToCapture.CanWrite; }
- }
- public override void Flush()
- {
- _streamToCapture.Flush();
- }
- public override long Length
- {
- get { return _streamToCapture.Length; }
- }
- public override long Position
- {
- get
- {
- return _streamToCapture.Position;
- }
- set
- {
- _streamToCapture.Position = value;
- }
- }
- public override int Read(byte[] buffer,int offset,int count)
- {
- return _streamToCapture.Read(buffer,offset,count);
- }
- public override long Seek(long offset,SeekOrigin origin)
- {
- return _streamToCapture.Seek(offset,origin);
- }
- public override void SetLength(long value)
- {
- _streamToCapture.SetLength(value);
- }
- public override void Write(byte[] buffer,int count)
- {
- _streamContent += _responseEncoding.GetString(buffer);
- _streamToCapture.Write(buffer,count);
- }
- public override void Close()
- {
- _streamToCapture.Close();
- base.Close();
- }
- }
- #region IHttpModule Members
- private HttpApplication _context;
- public void Dispose()
- {
- }
- public void Init(HttpApplication context)
- {
- _context = context;
- context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
- context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent);
- }
- void context_PreRequestHandlerExecute(object sender,EventArgs e)
- {
- _context.Response.Filter = new ResponseCaptureStream(_context.Response.Filter,_context.Response.ContentEncoding);
- }
- void context_PreSendRequestContent(object sender,EventArgs e)
- {
- ResponseCaptureStream filter = _context.Response.Filter as ResponseCaptureStream;
- if (filter != null)
- {
- string responseText = filter.StreamContent;
- // Logging logic here
- }
- }
- #endregion
- }