asp.net mvc 静态化

静态化的基本理解就是,常用的资源以文本形式保存,客户端访问时无需经过程序处理,直接下载

但是不存在的文件需要经过程序处理,文件内容如果需要有更动或删除,则直接删除文件本身

1.IIS Express 添加对json mine文件支持

在IIS Express文件夹里 运行以下命令

appcmd set config /section:staticContent /+[fileExtension=‘.json‘,mimeType=‘application/json‘]

2.IIS里添加 json mine文件支持

点击添加

这样 iis 和 iis express都可以直接访问已存在的静态资源(*.json)

3. 添加路由(如果不存在的文件如何处理)

在 routeConfig.cs文件里 添加

routes.MapRoute(
name: "H5Jsonp",
url: "Content/H5/{filename}.json",
defaults: new { controller = "H5", action = "JosnpFile" });

4.添加 controller

/// <summary>
    /// Json文件
    /// </summary>
    [StaticJsonFile("H5")]
    public class H5Controller : Controller
    {

        /// <summary>
        /// JsonpFile
        /// </summary>
        /// <param name="filename">json文件名</param>
        /// <returns></returns>
        public ActionResult JosnpFile(string filename)
        {
            return Content("");
        }
    }

5.核心代码

/// <summary>
    /// 文件静态化特性类
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class StaticJsonFileAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 文件名
        /// </summary>
        private string FileName { get; set; }

        /// <summary>
        /// 文件扩展名
        /// </summary>
        private string Suffix { get; set; }

        /// <summary>
        /// 静态化文件存放路径
        /// </summary>
        private string FileDirectory { get; set; }

        /// <summary>
        /// 类型
        /// </summary>
        private string Type { get; set; }

        /// <summary>
        /// 文件扩展字典
        /// </summary>
        private static readonly Dictionary<string, string> FileSuffixByTypeDirectory;

        /// <summary>
        /// 文件扩展字典
        /// </summary>
        private static Dictionary<string, object> LockDict = new Dictionary<string, object>();

        /// <summary>
        /// .ctor
        /// </summary>
        static StaticJsonFileAttribute()
        {

            FileSuffixByTypeDirectory = new Dictionary<string, string>()
            {
                { "H5", ".json" },
            };
        }

        /// <summary>
        /// .ctor
        /// </summary>
        public StaticJsonFileAttribute()
            : this("H5")
        {

        }

        /// <summary>
        /// .ctor
        /// </summary>
        /// <param name="type"></param>
        public StaticJsonFileAttribute(string type)
        {
            Type = type;
            FileDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Type);
            if (FileSuffixByTypeDirectory.ContainsKey(type))
            {
                Suffix = FileSuffixByTypeDirectory[type];
            }
        }

        /// <summary>
        /// Action执行前过滤器
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (string.IsNullOrEmpty(Suffix))
            {
                return;
            }

            string parmaValue = null;
            //获取参数值

            var parameterInfo = filterContext.Controller.ValueProvider.GetValue("filename");
            if (parameterInfo == null)
            {
                return;
            }

            parmaValue = parameterInfo.AttemptedValue;
            if (string.IsNullOrEmpty(parmaValue))
            {
                return;
            }

            FileName = parmaValue;
            var lockKey = Type + ":" + FileName;
            if (!LockDict.ContainsKey(lockKey))
            {
                LockDict.Add(lockKey, new object());
            }

            var fileInfo = GetFileInfoByRequestUrl(filterContext);
            if (fileInfo == null)
            {
                return;
            }//在实用时,这里应当调用相应的服务,获取数据//建议在类里设置一个IGetData 字段,由autofac自动注入,在这里直接调用即可
            var dict = new Dictionary<string, string>();
            dict.Add("H5.App.AdText", "你是个大笨蛋!");
            var content = dict.ToJsonNoneFormat();
            System.Threading.Tasks.Task.Run(() =>
            {
                if (!fileInfo.Exists)
                {
                    lock (LockDict[lockKey])
                    {   //下面其实应当再加上 if(!fileInfo.exiests)的判断
                        FileStream fileStream = null;

                        try
                        {
                            fileStream = new FileStream(fileInfo.FullName, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None);
                            var bytes = Encoding.UTF8.GetBytes(content);
                            fileStream.Write(bytes, 0, bytes.Length);
                        }
                        finally
                        {
                            if (fileStream != null) fileStream.Close();
                        }
                    }
                }
            });

            filterContext.Result = new JsonpResult("callback")
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = dict,
            };
        }

        /// <summary>
        /// 根据请求定义文件路径
        /// </summary>
        /// <param name="controllerContext"></param>
        /// <returns></returns>
        protected virtual FileInfo GetFileInfoByRequestUrl(ControllerContext controllerContext)
        {
            if (!string.IsNullOrWhiteSpace(FileName))
            {
                var key = FileName.Replace(Suffix, "");
                var fileName = Path.Combine(FileDirectory, string.Format("{0}{1}", key, Suffix));

                return new FileInfo(fileName);
            }

            return null;
        }
    }

6. jsonp类

/// <summary>
    /// Jsonp 的结果
    /// </summary>
    public class JsonpResult : JsonResult
    {
        /// <summary>
        /// .ctor
        /// Jsonp
        /// </summary>
        public JsonpResult()
        {
            this.Callback = "callback";
        }

        /// <summary>
        /// .ctor
        /// Jsonp
        /// </summary>
        /// <param name="callback">callback</param>
        public JsonpResult(string callback)
        {
            this.Callback = callback;
        }

        /// <summary>
        /// Jsonp 回调的 function 名称,默认为 callback
        /// </summary>
        public string Callback { get; set; }

        /// <summary>
        /// ExecuteResult
        /// </summary>
        /// <param name="context">context</param>
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var request = context.HttpContext.Request;
            var response = context.HttpContext.Response;
            string jsoncallback = (context.RouteData.Values[this.Callback] as string) ?? request[this.Callback];
            if (string.IsNullOrEmpty(jsoncallback))
            {
                jsoncallback = "callback" + DateTime.Now.Ticks.ToString();
            }

            if (string.IsNullOrEmpty(base.ContentType))
            {
                base.ContentType = "application/x-javascript";
            }

            response.Write(string.Format("{0}(", jsoncallback));

            response.Headers.Add("P3P", "CP=CAO PSA OUR");
            response.Headers.Add("Access-Control-Allow-Origin", "*");

            base.ExecuteResult(context);
            if (!string.IsNullOrEmpty(jsoncallback))
            {
                response.Write(")");
            }
        }
    }

7.调用

http://localhost:6248/content/H5/58b92c3f2213028b202298209.json?_=1488857755563&callback=fn_58b92c3f2213028b22298209
时间: 2024-10-01 21:24:50

asp.net mvc 静态化的相关文章

ASP.NET页面静态化 之 (伪静态)

1.页面为何要静态化 有利于搜索引擎优化(SEO) 使页面URL看起来更正规 真静态 的效率更高,并且更安全,HTML页面不会受Asp.Net相关漏洞的影响: 2.伪静态原理 其原理就是,在一个页面请求的执行期间将伪静态的URL重写成真实的URL路径: 3.那种条件下需要静态化 一个页面经常被访问,并且页面内容基本不变的: 所有用户访问的页面内容基本一样的. 例如:(新闻模块) 4.下面开始带领大家写一个伪静态的案例(新闻模块) (1)先创建新闻模块数据库 T_Channels表,存储新闻类别

Asp.Net MVC 插件化开发简化方案

Web 管理系统可以庞大到不可想像的地方,如果想就在一个 Asp.Net MVC 项目中完成开发,这个工程将会变得非常庞大,协作起来也会比较困难.为了解决这个问题,Asp.Net MVC 引入了 Areas 的概念,将模块划分到 Area 中去--然而 Area 仍然是主项目的一部分,多人协作的时候仍然很容易造成 .csproj 项目文件的冲突. 对于这类系统,比较好的解决办法是采用 SOA 的方式,把一个大的 Web 系统划分成若干微服务,通过一个含授权中心的 Web 集散框架组织起来.不过这

ASP.NET MVC 插件化机制

概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具体实现可以参考nopCommerce解决方案中Nop.Core项目的Plugins目录下的相关文件.其中PluginManager.cs文件是核心文件,包含了处理插件化的核心代码.nopCommerce的注释中感谢了其参考的Umbraco项目,并给出了主要参考文章的链接. 我们直接从nopCommerce

spring mvc 实战化项目之三板斧

接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开spring mvc的项目实战化魅力. 开发技术选型:spring mvc+freemarker+bootstrap+mybatis+mysql. 项目目录结构: (1)业务表 tb_role_info -- ---------------------------- -- Table structure for `tb_role_info` 用户角色表 -- ---------------------------- DROP

利用ResultFilter实现asp.net mvc 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容的文本保存,直接上代码: public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext filterC

[转] 利用 ResultFilter 实现 Asp.net Mvc 3 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于 asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过 mvc 提供的过滤器扩展点实现页面内容的文本保存,直接上代码: 1 public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter 2 { 3 public void OnResultExecuted(ResultExecutedContex

Asp.Net MVC页面静态化功能实现二:用递归算法来实现

上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter 后来想到可以通过WebRequest获取html代码,然后采用递归算法来实现.基本实现思路如下: 通过WebRequest获取超链接地址返回的html代码,并保存:通过正则表达式匹配html代码中所有的超链接hr

ASP.NET MVC 利用Razor引擎生成静态页

实现原理及步骤: 1.通过ViewEngines.Engines.FindView查找到对应的视图,如果是部分视图,则用:ViewEngines.Engines.FindPartialView: 2.设置上下文对象里的Model: 3.调用视图的Render()方法,将渲染结果保存到物理静态文件: 使用视图引擎进行静态化操作,主要使用到了两个类:ViewEngines类和ViewContext类.通过ViewEngines类的FindView方法或FindPartialView方法找到要进行静态

Asp.net动态页面静态化之初始NVelocity模板引擎

Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含"?"."="."&"等特殊符号. 静态页面不能自主管理公布更新的页面,假设想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件改动(通过fso等技术例外) 常见的静态页面举例:.html扩展名的..htm扩展名的. 注意:静态页面并