Asp.Net 截取输出流

起因

因为相对IIS做一些设置来优化一下

不修改代码就能优化ASP.NET网站性能的一些方法
主要参照了这里的文档 其他都还ok 就是内容过期这块跟leader有点冲突,leader觉得这个可以用但是万一想更新个图片,js什么的,客户端不能及时展示,甚至有可能引发bug。想让我在不动原代码的基础上,在更改资源后达到客户端刷新的效果。浏览器如果已经缓存了静态资源,服务器在更改资源的情况下,没有什么方式能够告诉客户端内容改变了。比如说 客户端缓存了一张图片,服务器这边图片名没变,但内容变了,客户端是没有办法知道这张图片已经变了的。浏览器在向服务器发送请求之前,就知道“哦 我本地缓存有这张图片,直接用吧”,最后都不会发送请求。所以更改必须要等内容过期后才能在客户端展示。leader说那就写个httpmodule ,截取一下输出流 给这些静态资源加个查询字符串来强制让浏览器获取数据吧。
所以 问题来了 ,如何截取输出流并对内容进行更改呢?

解决方案

因为HttpResponse.Stream 是不能读了,所以没办法直接写个httpmoedule在发送内容前,读取内容更改再重写进去。拦截asp.net输出流并进行处理的方法

这儿提到了解决思路:

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

还有三种解决方式  
前两种 只是针对aspx,应该可以使用,后一种试了试报:不能筛选的错误。
所以要针对静态文件,只能再看看其他方法。
后来就找到了 这个 [Asp.net2.0 中自定义过滤器对Response内容进行处理](http://www.cnblogs.com/DrWang/archive/2011/04/15/2016797.html)
别看时间老,还真管用。

ps:有可能需要设置一下,让静态文件也走Asp.net管道
posted @ 2018-03-14 22:14  waslm  阅读(355)  评论(0编辑  收藏  举报