起因
因为相对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管道