首页 > 学院 > 开发设计 > 正文

拦截asp.net输出流做处理

2019-11-17 01:43:14
字体:
来源:转载
供稿:网友

拦截asp.net输出流做处理

本文标题是指对已经生成了HTML的页面做一些输出到客户端之前的处理。

方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变成了向StringBuilder输出,然后我们对StringBuilder处理完成之后,再把Response的输出重定向到原来的页面上,然后再通过Response.Write方法把StringBuilder的内容输出到页面上

这里之所以用反射,是因为Response对象的OutPut属性是只读的,通过反编译该类的程序集发现,OutPut实际上是内部私有成员 _writer来实现输出的。因此通过反射来改写该成员的值以实现输出流的重定向。

[c-sharp]view plaincopy
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Web;
  5. usingSystem.Web.UI;
  6. usingSystem.Web.UI.WebControls;
  7. usingSystem.Text;
  8. usingSystem.IO;
  9. usingSystem.Reflection;
  10. publicpartialclass_Default:System.Web.UI.Page
  11. {
  12. StringBuildercontent=newStringBuilder();
  13. TextWritertw_old,tw_new;
  14. FieldInfotw_field;
  15. PRotectedvoidPage_Load(objectsender,EventArgse)
  16. {
  17. varcontext=HttpContext.Current;
  18. tw_old=context.Response.Output;//Response原来的OutPut
  19. tw_new=newStringWriter(content);//一个StringWriter,用来获取页面内容
  20. vartype_rp=context.Response.GetType();
  21. //通过反射获取对象的私有字段
  22. tw_field=type_rp.GetField("_writer",System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance);
  23. tw_field.SetValue(context.Response,tw_new);
  24. }
  25. protectedoverridevoidRender(HtmlTextWriterwriter)
  26. {
  27. base.Render(writer);
  28. //替换回Response的OutPut
  29. tw_field.SetValue(HttpContext.Current.Response,tw_old);
  30. //做自己的处理
  31. content.AppendLine("<!--江湖小子-->");
  32. HttpContext.Current.Response.Write(content.ToString());
  33. }
  34. }
  35. 方法二,用HttpModul来实现:
  36. usingSystem;
  37. usingSystem.Collections.Generic;
  38. usingSystem.Linq;
  39. usingSystem.Web;
  40. usingSystem.Web.UI;
  41. usingSystem.IO;
  42. usingSystem.Text;
  43. usingSystem.Reflection;
  44. ///<summary>
  45. ///HttpModule的摘要说明
  46. ///</summary>
  47. publicclassHttpModule:IHttpModule
  48. {
  49. privateHttpapplication_contextApplication;
  50. privateTextWritertw_new,tw_old;
  51. privateStringBuilder_content;
  52. privateFieldInfotw_field;
  53. publicvoidInit(HttpApplicationcontext)
  54. {
  55. _contextApplication=context;
  56. _contextApplication.PreRequestHandlerExecute+=newEventHandler(_contextApplication_PreRequestHandlerExecute);
  57. }
  58. publicvoidDispose()
  59. {
  60. _contextApplication=null;
  61. _contextApplication.Dispose();
  62. }
  63. publicvoid_contextApplication_PreRequestHandlerExecute(objectsender,EventArgse)
  64. {
  65. HttpContextcontext=_contextApplication.Context;
  66. var_page=context.HandlerasSystem.Web.UI.Page;
  67. _page.Unload+=newEventHandler(_page_Unload);
  68. _content=newStringBuilder();
  69. tw_old=context.Response.Output;//Response原来的OutPut
  70. tw_new=newStringWriter(_content);//一个StringWriter,用来获取页面内容
  71. vartype_rp=context.Response.GetType();
  72. tw_field=type_rp.GetField("_writer",System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance);
  73. tw_field.SetValue(context.Response,tw_new);
  74. }
  75. void_page_Unload(objectsender,EventArgse)
  76. {
  77. //替换回Response的OutPut
  78. tw_field.SetValue(HttpContext.Current.Response,tw_old);
  79. //做自己的处理
  80. _content.AppendLine("<!--江湖小子-->");
  81. HttpContext.Current.Response.Write(_content.ToString());
  82. }
  83. }
  84. 方法三:
  85. publicclassHttpModule:IHttpModule
  86. {
  87. privateHttpApplication_contextApplication;
  88. privateTextWritertw_new,tw_old;
  89. privateStringBuilder_content;
  90. privateFieldInfotw_field;
  91. publicvoidInit(HttpApplicationapplication)
  92. {
  93. _contextApplication=application;
  94. _contextApplication.BeginRequest+=newEventHandler(_contextApplication_BeginRequest);
  95. _contextApplication.EndRequest+=newEventHandler(_contextApplication_EndRequest);
  96. }
  97. void_contextApplication_BeginRequest(objectsender,EventArgse)
  98. {
  99. _content=newStringBuilder();
  100. tw_old=_contextApplication.Response.Output;
  101. tw_new=newStringWriter(_content);
  102. vartype_rp=_contextApplication.Response.GetType();
  103. tw_field=type_rp.GetField("_writer",System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance);
  104. tw_field.SetValue(_contextApplication.Response,tw_new);
  105. }
  106. void_contextApplication_EndRequest(objectsender,EventArgse)
  107. {
  108. tw_field.SetValue(_contextApplication.Response,tw_old);
  109. //做自己的处理
  110. _content.AppendLine("<!--jhxz-->");
  111. _contextApplication.Response.Write(_content.ToString());
  112. }
  113. publicvoidDispose()
  114. {
  115. _contextApplication=null;
  116. _contextApplication.Dispose();
  117. }
  118. }

最后还是推荐一篇好文:码农欧洲出差的一点小插曲


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表