Esempio n. 1
0
        /// <summary>
        /// 输出缓存内容
        /// </summary>
        /// <param name="response"></param>
        /// <param name="maxage"></param>
        /// <param name="handler"></param>
        /// <returns>是否缓存在客户端</returns>
        public static bool Output(ICompatibleResponse response, int maxage, StringCreatorHandler handler)
        {
            /*
             *     Public  指示响应可被任何缓存区缓存。
             *     Private  指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的
             *     部分响应消息,此响应消息对于其他用户的请求无效。
             *     no-cache  指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)
             *     根据什么能被缓存
             *     no-store  用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
             *     根据缓存超时
             *     max-age  指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
             *     min-fresh  指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
             *     max-stale  指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以
             *     接收超出超时期指定值之内的响应消息。
             *     Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的
             *     效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
             *     格式:
             */

            #region 获取缓存状态

            ICompatibleRequest request = HttpHosting.Context.Request;

            //现在时间
            DateTime nowTime = DateTime.Now.ToUniversalTime();
            bool     b       = request.TryGetHeader("If-Modified-Since", out var sinceModified);
            if (b)
            {
                //最后修改时间
                DateTime sinceTime;
                DateTime.TryParse(sinceModified, out sinceTime);
                sinceTime = sinceTime.ToUniversalTime();

                if ((nowTime - sinceTime).TotalSeconds < maxage)
                {
                    response.StatusCode(304);
                    // response.Status = "304 Not Modified";
                    return(true);
                }
            }

            #endregion

            #region 输出内容并缓存

            response.WriteAsync(handler());

            response.AddHeader("Cache-Control", "max-age=" + maxage.ToString());
            response.AddHeader("Last-Modified", nowTime.ToString("r"));

            #endregion

            return(false);
        }
Esempio n. 2
0
 /// <summary>
 /// 输出缓存内容
 /// </summary>
 /// <param name="response"></param>
 /// <param name="etag"></param>
 /// <param name="handler"></param>
 /// <returns>是否缓存在客户端</returns>
 public static void Output(ICompatibleResponse response, string etag, StringCreatorHandler handler)
 {
     HttpHosting.Context.Request.TryGetHeader("If-None-Match", out var clientEtag);
     if (String.Compare(clientEtag, String.Concat("\"", etag, "\""), false) == 0)
     {
         response.StatusCode(304);
         //response.Status = "304 Not Modified";
         return;
     }
     response.AddHeader("ETag", "\"" + etag + "\"");
     response.WriteAsync(handler());
 }
Esempio n. 3
0
        protected void RenderTemplateUseCache(string content, object dataObj)
        {
            if (!Cms.Cache.CheckClientCacheExpiresByEtag())
            {
                return;
            }

            string html     = null;
            var    response = Response;

            var _tpl = new MicroTemplateEngine(tpl);

            html = _tpl.Execute(content);

            if (dataObj != null)
            {
                //替换传入的标签参数
                var    properties = dataObj.GetType().GetProperties();
                object dataValue;
                foreach (var p in properties)
                {
                    dataValue = p.GetValue(dataObj, null);
                    if (dataValue != null)
                    {
                        html = ReplaceHtml(html, p.Name, dataValue.ToString());
                    }
                }
            }

            var query = HttpHosting.Context.Request.GetQueryString();

            if (!Array.Exists(ignoreURI, a => query.IndexOf(a) != -1))
            {
                html = CompressHtml(html);
            }


setHeader:

            //设置缓存
            Cms.Cache.SetClientCacheByEtag(Response);
            response.ContentType("text/html;charset=utf-8");

            //输出内容
            Response.WriteAsync(html);

            //todo: gzip
            // if (Settings.Opti_SupportGZip)
            // {
            //     response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            //     response.AddHeader("Content-Encoding", "gzip");
            // }
            //
            // response.AddHeader("X-AspNet-Version", String.Format("jr.Cms v{0}", Cms.Version));
            // response.AddHeader("Support-URL", "cms.to2.net/cms/");
        }
Esempio n. 4
0
 internal void RenderSuccess(string message)
 {
     Response.WriteAsync(ReturnSuccess(message));
 }