OutputCache缓存设置 条件 Cookies设置缓存无效

我们知道OutputCache缓存的设置是在 OutputCacheModule 的OnLeave方法中,这里面有一个条件判断,只有当  flag = true才会做缓存处理,但是这个条件究竟要做些什么了,为了还理解代码我们把代码调整一下:

 if (response.HasCachePolicy)
            {
                cache = response.Cache;
                if ( cache.IsModified() && response.Cookies.Count <= 0 && response.StatusCode == 200
                    && (request.HttpVerb == HttpVerb.GET || request.HttpVerb == HttpVerb.POST)
                    && response.IsBuffered()
)
                {
                    bool flag3 = false;
                    if ((cache.GetCacheability() == HttpCacheability.Public) && context.RequestRequiresAuthorization())
                    {
                        cache.SetCacheability(HttpCacheability.Private);
                        flag3 = true;
                    }
                    if ((
                        (cache.GetCacheability() == HttpCacheability.Public || cache.GetCacheability() == HttpCacheability.ServerAndPrivate|| cache.GetCacheability() == HttpCacheability.Server || flag3)  && !cache.GetNoServerCaching() && (cache.HasExpirationPolicy() || cache.HasValidationPolicy()))
                        && ((!cache.VaryByHeaders.GetVaryByUnspecifiedParameters() && (cache.VaryByParams.AcceptsParams() || (request.HttpVerb != HttpVerb.POST && !request.HasQueryString) ))
                        && (!cache.VaryByContentEncodings.IsModified() || cache.VaryByContentEncodings.IsCacheableEncoding(context.Response.GetHttpHeaderContentEncoding()) )
                        ))
                    {
                        flag = true;
                    }
                }
            }

尤其是里面的条件比较复杂,现在我们就来看看这个条件究竟干了些什么吧:

response.HasCachePolicy这个属性基本上都是为true的。一般我们不用考虑它为false的情况。cache.IsModified()、IsBuffered()一般情况下也是为true的。外层条件我们需要注意一个条件就是response.Cookies.Count <= 0,也就是说 我们的服务端是不能写Cookie,一旦写入Cookie则缓存失效

在内层的判断分为3部分,我已经用不同的颜色区分它们了:

第一部分我们需要cache.GetNoServerCaching()这个方法必须返回fasle,返回true的情况有2种分别是配置为:noStore="true"和调用 HttpCachePolicy的 public void SetNoServerCaching()方法,第一部分的判断其它也好理解。

第二部分中GetVaryByUnspecifiedParameters方法必须返回 false,该方法一般返回都是false,返回为true的情况也比较好理解,如果调用HttpCacheVaryByHeaders的 public void VaryByUnspecifiedParameters()方法,剩下的也比较好理解。

第三部分也很好理解,检查VaryByContentEncodings是否被修改,如果修改了那么它必须包含context.Response.GetHttpHeaderContentEncoding()

我现在实际项目中也没遇到什么特别的,只是输出流设置Cookies时缓存无效倒是遇到过,总之这几个判断条件还是比较重要的,希望大家小心啊。

posted on   dz45693  阅读(3017)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

导航

< 2012年11月 >
28 29 30 31 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示