从ASP.NET捕捉生成的HTML [英] Capturing HTML generated from ASP.NET

查看:107
本文介绍了从ASP.NET捕捉生成的HTML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最好如何捕捉到HTML(在我的情况下,用于日志记录)通过一个aspx页面呈现?

How do I best capture the HTML (in my instance, for logging) rendered by an aspx-page?

我不希望有写回用的Response.Write的页面,因为它打乱了我的网站布局。

I dont want to have to write back to the page using Response.Write, since it messes up my site layout.

使用Response.OutputStream或一个ArgumentException Response.Output的流导致({System.ArgumentException:流未读)

Using the Response.OutputStream or Response.Output's stream results in an ArgumentException ({System.ArgumentException: Stream was not readable.)

推荐答案

好问题,我不得不尝试,看看我能创造一个的HttpModule做你所描述的。

Good question, i had to try out and see if i could create a HttpModule to do what you are describing.

我没有任何侥幸试图从responsestream阅读,但使用ResponseFilter给了我一个方式捕捉的内容。

I didnt have any luck trying to read from the responsestream, but using the ResponseFilter gave me a way to capture the content.

以下code似乎工作pretty好了,我想也许你可以用code的位置。但是,请记住,这只是我的东西扔在一起快,它并没有被以任何方式进行测试。所以不使用它在任何生产环境没有适当的审查/测试和这样的。随意就可以了,虽然作出评论)

The following code seems to work pretty good, and i figured maybe you could use the code as a base. But remember this is just something i threw together fast, it has not been tested in any way. So dont use it in any production environment without proper reviewing/testing and such. Feel free to comment on it though ;)

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
}

这篇关于从ASP.NET捕捉生成的HTML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆