Asp.Net 截取输出流

本文探讨了在不修改代码的前提下,通过增加查询字符串强制浏览器刷新缓存的方法,解决了ASP.NET网站中静态资源更新的问题。同时介绍了如何利用HTTPModule及反射技术重定向输出流以实现对静态文件的处理。
摘要由CSDN通过智能技术生成

起因

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

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

解决方案

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

这儿提到了解决思路:
把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变成了向StringBuilder输出,然后我们对StringBuilder处理完成之后,再把Response的输出重定向到原来的页面上,然后再通过Response.Write方法把StringBuilder的内容输出到页面上。 这里之所以用反射,是因为Response对象的OutPut属性是只读的,通过反编译该类的程序集发现,OutPut实际上是内部私有成员 _writer来实现输出的。因此通过反射来改写该成员的值以实现输出流的重定向。

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

ps:有可能需要设置一下,让静态文件也走Asp.net管道

转载于:https://www.cnblogs.com/prayol/p/8507994.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值