首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >捕获从ASP.NET生成的超文本标记语言

捕获从ASP.NET生成的超文本标记语言
EN

Stack Overflow用户
提问于 2008-12-22 15:18:11
回答 3查看 8.4K关注 0票数 18

如何最好地捕获由aspx页面呈现的HTML (在我的实例中,用于日志记录)?

我不想使用Response.Write写回页面,因为它弄乱了我的站点布局。

使用Response.OutputStream或Response.Output的流会导致ArgumentException ({System.ArgumentException: stream不可读。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-22 16:22:00

问得好,我不得不试一试,看看我是否可以创建一个HttpModule来做你所描述的事情。

我没有任何机会尝试从响应流中读取,但是使用ResponseFilter给了我一种捕获内容的方法。

下面的代码看起来运行得很好,我想也许你可以使用这些代码作为基础。但请记住,这只是我快速拼凑起来的东西,它没有以任何方式进行测试。所以不要在任何生产环境中使用它,除非进行了适当的审查/测试等等。尽管如此,请随时对此发表评论;)

代码语言:javascript
复制
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 offset, int count)
        {
            _streamContent += _responseEncoding.GetString(buffer);
            _streamToCapture.Write(buffer, offset, 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
}
票数 25
EN

Stack Overflow用户

发布于 2008-12-22 15:23:16

许多负载测试器将允许您记录所生成的超文本传输协议响应,但请记住,对于ASP.NET,这些可能是一些非常大的日志文件。

编辑:根据Tom Jelen的代码,Response.Filter就是为了提供这种疏忽而设计的,而Response.Outputstream在其他方面是不可读的。

编辑2:用于页面而不是HTTPModule

代码语言:javascript
复制
public class ObserverStream : Stream
{
  private byte[] buffer = null;
  private Stream observed = null;

  public ObserverStream (Stream s)
  {
    this.observed = s;
  }

  /* important method to extend #1 : capturing the data */
  public override void Write(byte[] buffer, int offset, int count)
  {
    this.observed.Write(buffer, offset, count);
    this.buffer = buffer; //captured!
  }

  /* important method to extend #2 : doing something with the data */
  public override void Close()
  {
    //this.buffer available for logging here!
    this.observed.Close();
  }

  /* override all the other Stream methods/props with this.observed.method() */

  //...

}

在你的Page_Load中(或者在你的响应被写出来之前)

代码语言:javascript
复制
Response.Filter = new ObserverStream(Response.Filter);
票数 4
EN

Stack Overflow用户

发布于 2008-12-22 15:35:11

向您自己的服务器发出服务器端XMLHTTP请求的一种方法。抓取结果并将其保存到文件或DB中。

或者,您也可以在客户机上使用AJAX,获取结果,然后将其发送回服务器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/386487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档