• 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时缓存无效倒是遇到过,总之这几个判断条件还是比较重要的,希望大家小心啊。

  • 相关阅读:
    MySQL5.7 容器化安装
    什么是架构?——软件系统架构的定义
    服务端高并发分布式架构演进之路(转)
    CentOS7 增加回环地址
    三句话看明白jdk收费吗
    【转载】C#里怎么把string类型转换成double
    【转载】如何查看自己网站的搜索引擎收录量和索引量
    【转载】c# datatable 判断值是否存在
    【转载】C#中Datatable修改列名
    【转载】C#使用typeof运算符获取对象变量的具体类型Type
  • 原文地址:https://www.cnblogs.com/majiang/p/2789212.html
Copyright © 2020-2023  润新知