拦截asp.net mvc输出流做处理, 拦截HTML文本(asp.net MVC版)
以前的一个贴子写过一个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版)的更多相关文章
- 拦截asp.net输出流做处理, 拦截HTML文本(asp.net webForm版)
对已经生成了HTML的页面做一些输出到客户端之前的处理 方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变 成了 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行
我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
sql server 关于表中只增标识问题 由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...
- 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行
1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...
- 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 ...
- Spring MVC全局异常处理与拦截器校检
在使用Spring MVC进行开发时,总是要对系统异常和用户的异常行为进行处理,以提供给用户友好的提示,也可以提高系统的安全性. 拦截系统响应错误 首先是拦截系统响应错误,这个可以在web.xml中配 ...
- Spring3中的mvc:interceptors标签配置拦截器
mvc:interceptors 这个标签用于注册一个自定义拦截器或者是WebRequestInterceptors. 可以通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制. 例如在配置 ...
- Spring MVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
随机推荐
- Topself 方便调试的Window服务框架
Installing Topshelf nuget Install-Package Topshelf public class TownCrier { readonly Timer _timer; p ...
- ORACLE ORDER BY用法总结
order by后面的形式却比较新颖(对于我来说哦),以前从来没看过这种用法,就想记下来,正好总结一下ORDER BY的知识. 1.ORDER BY 中关于NULL的处理 缺省处理,Oracle在Or ...
- 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 ...
- 30分钟掌握ES6/ES2015核心内容
30分钟掌握ES6/ES2015核心内容 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript ...
- 6. Shell 流程控制
1. 条件选择流程 1.1 if #!/bin/bash # if 格式 #if condition #then # command1 # command2 # ... # commandN #fi ...
- Android实现动画循环的方式
每次想到循环播放.重复执行时,脑海中总是冒出在while(true)的实现方式. Thread thread = new Thread(new Runnable(){ public void run( ...
- (十)foreac遍历、break和countinue以及标签和switch循环
foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项. 例:输出数组的所有元素. float f[]=new float[5]; f[0]=1.0f ...
- 初学者必知的HTML规范
一.整体结构 用div代替table布局 结构.表现.行为三者分离,避免内联 良好的树形结构四个空格代替一个tab 能并列就不嵌套<div></div><div>& ...
- BUAA 2014级数据结构第五次上机 二叉树之数组转换广义表
按题意建立好二叉树,再按照先序遍历输出结果. #include<cstdio> #include<vector> #include<queue> #include& ...
- Java、C#双语版配套AES加解密示例
这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...