现在的位置: 首页 > 综合 > 正文

MVC静态化页面

2017年11月06日 ⁄ 综合 ⁄ 共 5643字 ⁄ 字号 评论关闭
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace WF_HightFood.App_Start
{

    public class StaticFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //filterContext.HttpContext.Response.Write("OnActionExecuted</br>");
            base.OnActionExecuted(filterContext);
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // filterContext.HttpContext.Response.Write("OnActionExecuting</br>");
            base.OnActionExecuting(filterContext);
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            //filterContext.HttpContext.Response.Write("OnResultExecuted</br>");

            if (filterContext.HttpContext.Response.StatusCode == 200)
            {
                filterContext.HttpContext.Response.Filter = new StaticFileWriteResponseFilterWrapper(filterContext.HttpContext.Response.Filter, filterContext);
            }
            // filterContext.HttpContext.Response.Charset = "utf8";
            base.OnResultExecuted(filterContext);
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            // filterContext.HttpContext.Response.Write("OnResultExecuting</br>");
            base.OnResultExecuting(filterContext);
        }
    }
    class StaticFileWriteResponseFilterWrapper : System.IO.Stream
    {
        private Stream inner;
        private FileStream writer;
        private ControllerContext context;
        private int expireSconds;
        private bool filter;
        private string tempPath, path;

        public StaticFileWriteResponseFilterWrapper(System.IO.Stream s, ControllerContext context, int expireSeconds = 600)
        {
            this.filter = false;
            this.inner = s;
            this.context = context;
            this.expireSconds = expireSeconds;
            this.EnsureStaticFile();
        }
        void EnsureStaticFile()
        {
            this.path = this.context.HttpContext.Server.MapPath(HttpContext.Current.Request.Path);

            if (!Path.HasExtension(path))
            {
                return;
            }
            if (!".html".Equals(Path.GetExtension(HttpContext.Current.Request.Path)))
            {
                return;
            }

            if (File.Exists(path))
            {
                var delay = DateTime.UtcNow - File.GetCreationTimeUtc(path);
                if (delay.TotalSeconds <= this.expireSconds)
                {
                    return;
                }
                File.Delete(path);
            }
            else
            {
                var dir = Path.GetDirectoryName(path);
                if (!Directory.Exists(dir))
                {

                    try
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(path));
                    }
                    catch
                    { }
                }
            }
            this.filter = true;

            this.tempPath = this.path + "_" + DateTime.Now.Ticks;

            try
            {
                writer = new FileStream(tempPath, FileMode.Create, FileAccess.Write);
            }
            catch
            {
                this.filter = false;
            }
        }



        public override bool CanRead
        {
            get { return inner.CanRead; }
        }

        public override bool CanSeek
        {
            get { return inner.CanSeek; }
        }

        public override bool CanWrite
        {
            get { return inner.CanWrite; }
        }

        public override void Flush()
        {
            inner.Flush();
        }



        public override long Length
        {
            get { return inner.Length; }
        }

        public override long Position
        {
            get
            {
                return inner.Position;
            }
            set
            {
                inner.Position = value;
            }
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return inner.Read(buffer, offset, count);
        }

        public override long Seek(long offset, System.IO.SeekOrigin origin)
        {
            return inner.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            inner.SetLength(value);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            try
            {
                inner.Write(buffer, offset, count);
            }
            catch (Exception ex)
            {
            }

            try
            {
                this.writer.Write(buffer, offset, count);
            }
            catch (Exception ex)
            {

            }
        }

        protected override void Dispose(bool disposing)
        {
            if (this.filter)
            {
                try
                {
                    if (this.writer != null)
                    {
                        this.writer.Dispose();
                        this.writer = null;
                    }

                    File.Delete(this.path);
                    File.Move(this.tempPath, this.path);
                    #region 生成文件日志
                   
                    #endregion
                }
                catch
                { }

            }
            base.Dispose(disposing);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using EnYuan.SMS;
using YJY.Site.SSO;
using EnYuan.BSS.User;
using EnYuan.BSS.User.Dto;
using WF_HightFood.App_Code;

namespace WF_HightFood.App_Start
{
    public class SSOFilterAttribute : ActionFilterAttribute
    {

        public string Message { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //if (!filterContext.HttpContext.Request.Url.ToString().ToLower().StartsWith("http://www."))
            //{
            //    filterContext.HttpContext.Response.Redirect(filterContext.HttpContext.Request.Url.ToString().Replace("http://", "http://www."));
            //    return;
            //}
            var sso_cookies = filterContext.HttpContext.Request.Cookies["sso_token"];
            if (sso_cookies == null || sso_cookies.Value == null || sso_cookies.Value.Equals(""))
            {
                //清空所有cookies
                filterContext.HttpContext.Request.Cookies.Clear();
                //如果不存在token,跳转到验证站点进行验证;
                filterContext.HttpContext.Response.Redirect("http://jump.yuan.cn/Home/index/?type=mvc&backurl=" + filterContext.HttpContext.Request.Url.ToString());
                return;
            }
            else
            {
                //如过存在token,检测登录状态
                var userid = ServiceLocator.Create<ISSOService>().CheckUser(sso_cookies.Value);
                if (userid != null)
                {
                    if (filterContext.HttpContext.Session["userid"] != userid || filterContext.HttpContext.Session["userid"] == null || filterContext.HttpContext.Session["isVip"] == null || filterContext.HttpContext.Session["username"] == null)
                    {
                        //用户id
                        filterContext.HttpContext.Session["userid"] = userid;
                        //取得用户对象
                        UserDto userInfo = ServiceLocator.Create<IUserService>().GetUser(userid);
                        filterContext.HttpContext.Session["isVip"] = DataAccess.isVip(userid);
                        filterContext.HttpContext.Session["username"] = !String.IsNullOrEmpty(userInfo.NickName) ? userInfo.NickName : userInfo.Name;
                    }
                }
                else
                {
                    filterContext.HttpContext.Session.Clear();
                }
            }
        }

        public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            // filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
            //filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);
            // filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
        }
    }
}

使用方法:

 [StaticFilter]
        public ActionResult Index()
        {

 return View();

}

抱歉!评论已关闭.