捕获从ASP.NET生成的HTML

前端之家收集整理的这篇文章主要介绍了捕获从ASP.NET生成的HTML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
如何最好地捕获由aspx页面呈现的HTML(在我的实例中,用于日志记录)?

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

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

解决方法

好的问题,我不得不尝试看看我是否可以创建一个HttpModule来做你正在描述的内容

我没有任何运气尝试从责任心读取,但使用ResponseFilter给了我一种方法来捕获的内容

以下代码似乎工作得很好,我想也许你可以使用代码作为基础。但请记住,这只是我快速投掷的东西,没有以任何方式进行测试。所以不要在任何生产环境中使用它,没有适当的检查/测试等等。随意评论它;)

  1. public class ResponseLoggerModule : IHttpModule
  2. {
  3. private class ResponseCaptureStream : Stream
  4. {
  5. private readonly Stream _streamToCapture;
  6. private readonly Encoding _responseEncoding;
  7.  
  8. private string _streamContent;
  9. public string StreamContent
  10. {
  11. get { return _streamContent; }
  12. private set
  13. {
  14. _streamContent = value;
  15. }
  16. }
  17.  
  18. public ResponseCaptureStream(Stream streamToCapture,Encoding responseEncoding)
  19. {
  20. _responseEncoding = responseEncoding;
  21. _streamToCapture = streamToCapture;
  22.  
  23. }
  24.  
  25. public override bool CanRead
  26. {
  27. get { return _streamToCapture.CanRead; }
  28. }
  29.  
  30. public override bool CanSeek
  31. {
  32. get { return _streamToCapture.CanSeek; }
  33. }
  34.  
  35. public override bool CanWrite
  36. {
  37. get { return _streamToCapture.CanWrite; }
  38. }
  39.  
  40. public override void Flush()
  41. {
  42. _streamToCapture.Flush();
  43. }
  44.  
  45. public override long Length
  46. {
  47. get { return _streamToCapture.Length; }
  48. }
  49.  
  50. public override long Position
  51. {
  52. get
  53. {
  54. return _streamToCapture.Position;
  55. }
  56. set
  57. {
  58. _streamToCapture.Position = value;
  59. }
  60. }
  61.  
  62. public override int Read(byte[] buffer,int offset,int count)
  63. {
  64. return _streamToCapture.Read(buffer,offset,count);
  65. }
  66.  
  67. public override long Seek(long offset,SeekOrigin origin)
  68. {
  69. return _streamToCapture.Seek(offset,origin);
  70. }
  71.  
  72. public override void SetLength(long value)
  73. {
  74. _streamToCapture.SetLength(value);
  75. }
  76.  
  77. public override void Write(byte[] buffer,int count)
  78. {
  79. _streamContent += _responseEncoding.GetString(buffer);
  80. _streamToCapture.Write(buffer,count);
  81. }
  82.  
  83. public override void Close()
  84. {
  85. _streamToCapture.Close();
  86. base.Close();
  87. }
  88. }
  89.  
  90. #region IHttpModule Members
  91.  
  92. private HttpApplication _context;
  93. public void Dispose()
  94. {
  95.  
  96. }
  97.  
  98. public void Init(HttpApplication context)
  99. {
  100. _context = context;
  101.  
  102. context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
  103. context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent);
  104. }
  105.  
  106. void context_PreRequestHandlerExecute(object sender,EventArgs e)
  107. {
  108. _context.Response.Filter = new ResponseCaptureStream(_context.Response.Filter,_context.Response.ContentEncoding);
  109. }
  110.  
  111. void context_PreSendRequestContent(object sender,EventArgs e)
  112. {
  113. ResponseCaptureStream filter = _context.Response.Filter as ResponseCaptureStream;
  114.  
  115. if (filter != null)
  116. {
  117. string responseText = filter.StreamContent;
  118.  
  119. // Logging logic here
  120. }
  121. }
  122.  
  123. #endregion
  124. }

猜你在找的asp.Net相关文章