从ASP.NET捕捉生成的HTML [英] Capturing HTML generated from ASP.NET
问题描述
我最好如何捕捉到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屋!