/// <summary> /// 解析入口 /// </summary> /// <param name="urlInfo"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> /// <param name="pageCode"></param> public void Parse(MaUrl urlInfo, IMaSite site, IMaSkin skin, MaPage page, ref StringBuilder pageCode) { //处理页面临时变量 foreach (KeyValuePair <string, string> item in Htmx.HtmxHandler.GetThisPageTempVariable()) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理页面变量 foreach (KeyValuePair <string, string> item in page.GetPageVariable()) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理皮肤变量 foreach (KeyValuePair <string, string> item in ((MaConfig)skin).Variables) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理站点变量 foreach (KeyValuePair <string, string> item in ((MaConfig)site).Variables) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理基本变量 pageCode = pageCode.Replace("{$_ma_this_domain}", urlInfo.Domain.Domain); pageCode = pageCode.Replace("{$_ma_this_root_domain}", urlInfo.Domain.MainDomain); }
/// <summary> /// 页面处理工具 /// </summary> /// <param name="context"></param> /// <param name="requestType"></param> /// <param name="url"></param> /// <param name="pathTranslated"></param> /// <returns></returns> public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) { if (MaWeb.Instance != null) { IMaSite _site = MaWeb.Instance.GetSite(context); if (_site == null) { throw new Exception("WebApp配置错误,请检查Ma.Config配置文件[MaWeb]配置结点!"); } IMaSkin _skin = _site.GetSkinConfig(context); MaPage _page = _site.GetRequestConfig(context); if (_page == null) { throw new Exception("WebApp配置错误,请检查Ma.Config配置文件[MaWeb]配置结点,没有设定默认页面处理类!"); } IHttpHandler _handler = _page.GetHandler(context); context.Response.Filter = new HtmxFilter(context.Response.Filter, MaUrl.Current, _page); if (_handler is HtmxHandlerBase) { HtmxHandlerBase _maHandler = (HtmxHandlerBase)_handler; _maHandler.InitPage(context, MaUrl.Current, MaWeb.Instance, _site, _skin, _page); } return(_handler); } else { throw new Exception("WebApp配置错误,请检查Ma.Config配置文件[MaWeb]配置结点"); } }
void CachePage() { //静态文件不存在,重写URL HttpContext.Current.RewritePath(MaUrl.Current.AbsolutePath + "l"); MaPage _page = MaWeb.Instance.GetSite(HttpContext.Current).GetRequestConfig(HttpContext.Current); //缓存页面,非编辑试图 HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddSeconds(_page.UpdateTime)); HttpContext.Current.Response.Cache.SetMaxAge(new TimeSpan((long)((long)_page.UpdateTime * 10000000))); HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public); HttpContext.Current.Response.Cache.SetValidUntilExpires(true); HttpContext.Current.Response.Cache.VaryByParams["none"] = true;//不带参数缓存页面 HttpContext.Current.Response.Cache.SetVaryByCustom(MaUrl.Current.AbsolutePath + "l"); }
/// <summary> /// 初始化页面信息 /// </summary> /// <param name="context"></param> /// <param name="url"></param> /// <param name="web"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> public virtual void InitPage(HttpContext context, MaUrl url, IMaWeb web, IMaSite site, IMaSkin skin, MaPage page) { //Http对象 Context = context; Request = context.Request; Response = context.Response; //Ma对象 m_maUrl = url; m_maweb = web; m_maSite = site; m_maSkin = skin; m_maPage = page; }
/// <summary> /// 标签处理虚方法 /// </summary> /// <param name="urlInfo"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> /// <param name="pageCode"></param> public virtual void Parse(MaUrl urlInfo, IMaSite site, IMaSkin skin, MaPage page, ref StringBuilder pageCode) { if (string.IsNullOrEmpty(m_tagRegexStr)) { throw new Exception("解析表情出错,当前类没有标签匹配字符串串,请给[TagRegexStr]赋值"); } //查询的正则表达式 Regex re = new Regex(m_tagRegexStr, RegexOptions.IgnoreCase); MatchCollection matches = re.Matches(pageCode.ToString()); foreach (Match var in matches) { MaTag _maTag = new MaTag(var.Value, urlInfo); ParseTag(urlInfo, site, skin, page, ref pageCode, _maTag); } }
/// <summary> /// 标签处理抽象函数 /// </summary> /// <param name="urlInfo"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> /// <param name="pageCode"></param> /// <param name="tag"></param> public abstract void ParseTag(MaUrl urlInfo, IMaSite site, IMaSkin skin, MaPage page, ref StringBuilder pageCode, MaTag tag);
/// <summary> /// 构造函数 /// </summary> /// <param name="sink"></param> /// <param name="url"></param> /// <param name="page"></param> public HtmxFilter(Stream sink, MaUrl url, MaPage page) { m_sink = sink; //非编辑模式 switch (url.RequestView) { case MaRequestView.Put: { switch (page.SaveWay) { case MaPageSaveWay.Null: break; case MaPageSaveWay.Save: { //保存静态文件 if (!(new FileInfo(url.SavePath)).Directory.Exists) { (new FileInfo(url.SavePath)).Directory.Create(); } m_fs = new FileStream(url.SavePath, FileMode.OpenOrCreate, FileAccess.Write); } break; case MaPageSaveWay.Cache: { #region 默认缓存模式 //设置页的可缓存性 HttpCacheability _cacheability = HttpCacheability.Server; if (!System.Enum.TryParse <HttpCacheability>(page.Location, out _cacheability)) { _cacheability = HttpCacheability.Server; } HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Server); //是否应忽略由使缓存无效的客户端发送的 HTTP Cache-Control 标头 HttpContext.Current.Response.Cache.SetValidUntilExpires(true); //设置页缓存的到期时间 HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddSeconds(page.UpdateTime)); HttpContext.Current.Response.Cache.SetMaxAge(new TimeSpan((long)((long)page.UpdateTime * 10000000))); //根据 HTTP 标头值进行缓存 if (!string.IsNullOrEmpty(page.Header)) { HttpContext.Current.Response.Cache.VaryByHeaders[page.Header] = true; } //使用参数对页的各个版本进行缓存 if (!string.IsNullOrEmpty(page.Param)) { HttpContext.Current.Response.Cache.VaryByParams[page.Param] = true; } //使用自定义字符串对页的各个版本进行缓存 if (!string.IsNullOrEmpty(page.Custom)) { HttpContext.Current.Response.Cache.SetVaryByCustom(page.Custom); } #endregion } break; case MaPageSaveWay.None: break; default: break; } } break; case MaRequestView.Edit: break; case MaRequestView.Update: { //模块中处理 } break; case MaRequestView.Delete: { //模块中处理 } break; case MaRequestView.Save: { //保存静态文件 if (!(new FileInfo(url.SavePath)).Directory.Exists) { (new FileInfo(url.SavePath)).Directory.Create(); } m_fs = new FileStream(url.SavePath, FileMode.OpenOrCreate, FileAccess.Write); } break; case MaRequestView.Null: { //模块中处理 } break; case MaRequestView.Cache: { //模块中处理 } break; default: break; } }