以前的一个贴子写过一个webForm的拦截HTML输出流的版本,最近用到mvc时用同样的方式发生一些问题。

  如下图

查了好久也不知道啥原因。

好吧, 我最后选择放弃。

  想起以前自定义Response.Filter 时,里面Write方法可以获取页面流的信息。

  这次我借用HttpModule实现拦截HTML内容输出流,下面看代码

一、HtmlHttpModule.cs    定义一个新类继承HttpModule

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace Monitor
{
public class HtmlHttpModule : IHttpModule
{
private HttpApplication _contextApplication;
private StringBuilder _content; public void Init(HttpApplication application)
{
_contextApplication = application;
_contextApplication.BeginRequest += new EventHandler(_contextApplication_BeginRequest);
_contextApplication.EndRequest += new EventHandler(_contextApplication_EndRequest);
} void _contextApplication_BeginRequest(object sender, EventArgs e)
{
#region
try
{
//创建存储页面文本的载体变量
_content = new StringBuilder();
_contextApplication.Response.Filter = new DefaultFilter(_contextApplication.Response.Filter, o => _content.Append(o));
}
catch (Exception ex)
{
//这里写入日志
}
#endregion
} void _contextApplication_EndRequest(object sender, EventArgs e)
{
#region
try
{
//只处理页面,排除掉css、js、txt文件的请求
if (_contextApplication.Request.Headers["Accept"].StartsWith("text/html"))
{
_content.Append("<!--这是新加的-->");
}
_contextApplication.Response.Write(_content.ToString());
}
catch (Exception ex)
{
//这里写入日志
}
#endregion
} public void Dispose()
{
_contextApplication = null;
if (_contextApplication != null)
{
_contextApplication.Dispose();
}
}
  }
}

二、DefaultFilter.cs     在module中我们给Response.Filter 自定义的筛选器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Web; namespace Monitor
{
public class DefaultFilter : Stream
{
Stream responseStream;
long position;
Action<String> action; public DefaultFilter(Stream inputStream,Action<String> act)
{
action = act;
responseStream = inputStream;
} public override bool CanRead
{
get
{
return responseStream.CanRead;
}
}
public override bool CanSeek
{
get
{
return responseStream.CanSeek;
}
} public override bool CanWrite
{
get
{
return responseStream.CanWrite;
}
} public override long Length
{
get
{
return responseStream.Length;
}
} public override long Position
{
get
{
return position;
}
set
{
position = value;
}
}
public override void Flush()
{
responseStream.Flush();
} public override int Read(byte[] buffer, int offset, int count)
{
return responseStream.Read(buffer, offset, count);
} public override long Seek(long offset, SeekOrigin origin)
{
return responseStream.Seek(offset, origin);
} public override void SetLength(long value)
{
responseStream.SetLength(value);
} public override void Write(byte[] buffer, int offset, int count)
{
action(HttpContext.Current.Response.ContentEncoding.GetString(buffer, offset, count));
}
}
}

三、web.config   该创建都创建好了,现在就让它在mvc中起作用吧

<system.webServer>
<modules>
<add name="Monotpr" type="Monitor.HtmlHttpModule,Monitor"/>
</modules>
</system.webServer>

拦截asp.net mvc输出流做处理, 拦截HTML文本(asp.net MVC版)的更多相关文章

  1. 拦截asp.net输出流做处理, 拦截HTML文本(asp.net webForm版)

    对已经生成了HTML的页面做一些输出到客户端之前的处理 方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变 成了 ...

  2. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  3. 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行

    我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...

  4. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  5. 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

    1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...

  6. ASP.NET Core 3.0 gRPC 拦截器

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 拦截器 一. 前言 前面两篇文章给大家介绍了使用g ...

  7. Spring MVC全局异常处理与拦截器校检

    在使用Spring MVC进行开发时,总是要对系统异常和用户的异常行为进行处理,以提供给用户友好的提示,也可以提高系统的安全性. 拦截系统响应错误 首先是拦截系统响应错误,这个可以在web.xml中配 ...

  8. Spring3中的mvc:interceptors标签配置拦截器

    mvc:interceptors 这个标签用于注册一个自定义拦截器或者是WebRequestInterceptors. 可以通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制. 例如在配置 ...

  9. Spring MVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

随机推荐

  1. Topself 方便调试的Window服务框架

    Installing Topshelf nuget Install-Package Topshelf public class TownCrier { readonly Timer _timer; p ...

  2. ORACLE ORDER BY用法总结

    order by后面的形式却比较新颖(对于我来说哦),以前从来没看过这种用法,就想记下来,正好总结一下ORDER BY的知识. 1.ORDER BY 中关于NULL的处理 缺省处理,Oracle在Or ...

  3. mssql update from

    update b set memo = a.name from a,b where a.id = b.id --mssql的update :from语法 2 --a表 b表 结构分别 id ,name ...

  4. 30分钟掌握ES6/ES2015核心内容

    30分钟掌握ES6/ES2015核心内容   ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript ...

  5. 6. Shell 流程控制

    1. 条件选择流程 1.1 if #!/bin/bash # if 格式 #if condition #then # command1 # command2 # ... # commandN #fi ...

  6. Android实现动画循环的方式

    每次想到循环播放.重复执行时,脑海中总是冒出在while(true)的实现方式. Thread thread = new Thread(new Runnable(){ public void run( ...

  7. (十)foreac遍历、break和countinue以及标签和switch循环

    foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项. 例:输出数组的所有元素. float f[]=new float[5]; f[0]=1.0f ...

  8. 初学者必知的HTML规范

    一.整体结构 用div代替table布局 结构.表现.行为三者分离,避免内联 良好的树形结构四个空格代替一个tab 能并列就不嵌套<div></div><div>& ...

  9. BUAA 2014级数据结构第五次上机 二叉树之数组转换广义表

    按题意建立好二叉树,再按照先序遍历输出结果. #include<cstdio> #include<vector> #include<queue> #include& ...

  10. Java、C#双语版配套AES加解密示例

      这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...