加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

捕获从ASP.NET生成的HTML

发布时间:2020-12-16 00:29:11 所属栏目:asp.Net 来源:网络整理
导读:如何最好地捕获由aspx页面呈现的HTML(在我的实例中,用于日志记录)? 我不想使用Response.Write写回页面,因为它弄乱了我的网站布局。 使用Response.OutputStream或Response.Output的流会导致ArgumentException({System.ArgumentException:Stream不可读)。
如何最好地捕获由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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读