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

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

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文件里 添加

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

注意:文件路径一定要放在 {WebRoot}/Content/H5/下面

4.添加 controller

  1. /// <summary>
  2. /// Json文件
  3. /// </summary>
  4. [StaticJsonFile("H5")]
  5. public class H5Controller : Controller
  6. {
  7.  
  8. /// <summary>
  9. /// JsonpFile
  10. /// </summary>
  11. /// <param name="filename">json文件名</param>
  12. /// <returns></returns>
  13. public ActionResult JosnpFile(string filename)
  14. {
  15. return Content("");
  16. }
  17. }

5.核心代码

  1. /// <summary>
  2. /// 文件静态化特性类
  3. /// </summary>
  4. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
  5. public class StaticJsonFileAttribute : ActionFilterAttribute
  6. {
  7. /// <summary>
  8. /// 文件名
  9. /// </summary>
  10. private string FileName { get; set; }
  11.  
  12. /// <summary>
  13. /// 文件扩展名
  14. /// </summary>
  15. private string Suffix { get; set; }
  16.  
  17. /// <summary>
  18. /// 静态化文件存放路径
  19. /// </summary>
  20. private string FileDirectory { get; set; }
  21.  
  22. /// <summary>
  23. /// 类型
  24. /// </summary>
  25. private string Type { get; set; }
  26.  
  27. /// <summary>
  28. /// 文件扩展字典
  29. /// </summary>
  30. private static readonly Dictionary<string, string> FileSuffixByTypeDirectory;
  31.  
  32. /// <summary>
  33. /// 文件扩展字典
  34. /// </summary>
  35. private static Dictionary<string, object> LockDict = new Dictionary<string, object>();
  36.  
  37. /// <summary>
  38. /// .ctor
  39. /// </summary>
  40. static StaticJsonFileAttribute()
  41. {
  42.  
  43. FileSuffixByTypeDirectory = new Dictionary<string, string>()
  44. {
  45. { "H5", ".json" },
  46. };
  47. }
  48.  
  49. /// <summary>
  50. /// .ctor
  51. /// </summary>
  52. public StaticJsonFileAttribute()
  53. : this("H5")
  54. {
  55.  
  56. }
  57.  
  58. /// <summary>
  59. /// .ctor
  60. /// </summary>
  61. /// <param name="type"></param>
  62. public StaticJsonFileAttribute(string type)
  63. {
  64. Type = type;
  65. FileDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Type);
  66. if (FileSuffixByTypeDirectory.ContainsKey(type))
  67. {
  68. Suffix = FileSuffixByTypeDirectory[type];
  69. }
  70. }
  71.  
  72. /// <summary>
  73. /// Action执行前过滤器
  74. /// </summary>
  75. /// <param name="filterContext"></param>
  76. public override void OnActionExecuting(ActionExecutingContext filterContext)
  77. {
  78. if (string.IsNullOrEmpty(Suffix))
  79. {
  80. return;
  81. }
  82.  
  83. string parmaValue = null;
  84. //获取参数值
  85.  
  86. var parameterInfo = filterContext.Controller.ValueProvider.GetValue("filename");
  87. if (parameterInfo == null)
  88. {
  89. return;
  90. }
  91.  
  92. parmaValue = parameterInfo.AttemptedValue;
  93. if (string.IsNullOrEmpty(parmaValue))
  94. {
  95. return;
  96. }
  97.  
  98. FileName = parmaValue;
  99. var lockKey = Type + ":" + FileName;
  100. if (!LockDict.ContainsKey(lockKey))
  101. {
  102. LockDict.Add(lockKey, new object());
  103. }
  104.  
  105. var fileInfo = GetFileInfoByRequestUrl(filterContext);
  106. if (fileInfo == null)
  107. {
  108. return;
  109. }
    //在实用时,这里应当调用相应的服务,获取数据
    //建议在类里设置一个IGetData 字段,由autofac自动注入,在这里直接调用即可
  110. var dict = new Dictionary<string, string>();
  111. dict.Add("H5.App.AdText", "你是个大笨蛋!");
  112. var content = dict.ToJsonNoneFormat();
  113. System.Threading.Tasks.Task.Run(() =>
  114. {
  115. if (!fileInfo.Exists)
  116. {
  117. lock (LockDict[lockKey])
  118. { //下面其实应当再加上 if(!fileInfo.exiests)的判断
  119. FileStream fileStream = null;
  120.  
  121. try
  122. {
  123. fileStream = new FileStream(fileInfo.FullName, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None);
  124. var bytes = Encoding.UTF8.GetBytes(content);
  125. fileStream.Write(bytes, , bytes.Length);
  126. }
  127. finally
  128. {
  129. if (fileStream != null) fileStream.Close();
  130. }
  131. }
  132. }
  133. });
  134.  
  135. filterContext.Result = new JsonpResult("callback")
  136. {
  137. JsonRequestBehavior = JsonRequestBehavior.AllowGet,
  138. Data = dict,
  139. };
  140. }
  141.  
  142. /// <summary>
  143. /// 根据请求定义文件路径
  144. /// </summary>
  145. /// <param name="controllerContext"></param>
  146. /// <returns></returns>
  147. protected virtual FileInfo GetFileInfoByRequestUrl(ControllerContext controllerContext)
  148. {
  149. if (!string.IsNullOrWhiteSpace(FileName))
  150. {
  151. var key = FileName.Replace(Suffix, "");
  152. var fileName = Path.Combine(FileDirectory, string.Format("{0}{1}", key, Suffix));
  153.  
  154. return new FileInfo(fileName);
  155. }
  156.  
  157. return null;
  158. }
  159. }

6. jsonp类

  1. /// <summary>
  2. /// Jsonp 的结果
  3. /// </summary>
  4. public class JsonpResult : JsonResult
  5. {
  6. /// <summary>
  7. /// .ctor
  8. /// Jsonp
  9. /// </summary>
  10. public JsonpResult()
  11. {
  12. this.Callback = "callback";
  13. }
  14.  
  15. /// <summary>
  16. /// .ctor
  17. /// Jsonp
  18. /// </summary>
  19. /// <param name="callback">callback</param>
  20. public JsonpResult(string callback)
  21. {
  22. this.Callback = callback;
  23. }
  24.  
  25. /// <summary>
  26. /// Jsonp 回调的 function 名称,默认为 callback
  27. /// </summary>
  28. public string Callback { get; set; }
  29.  
  30. /// <summary>
  31. /// ExecuteResult
  32. /// </summary>
  33. /// <param name="context">context</param>
  34. public override void ExecuteResult(ControllerContext context)
  35. {
  36. if (context == null)
  37. {
  38. throw new ArgumentNullException("context");
  39. }
  40.  
  41. var request = context.HttpContext.Request;
  42. var response = context.HttpContext.Response;
  43. string jsoncallback = (context.RouteData.Values[this.Callback] as string) ?? request[this.Callback];
  44. if (string.IsNullOrEmpty(jsoncallback))
  45. {
  46. jsoncallback = "callback" + DateTime.Now.Ticks.ToString();
  47. }
  48.  
  49. if (string.IsNullOrEmpty(base.ContentType))
  50. {
  51. base.ContentType = "application/x-javascript";
  52. }
  53.  
  54. response.Write(string.Format("{0}(", jsoncallback));
  55.  
  56. response.Headers.Add("P3P", "CP=CAO PSA OUR");
  57. response.Headers.Add("Access-Control-Allow-Origin", "*");
  58.  
  59. base.ExecuteResult(context);
  60. if (!string.IsNullOrEmpty(jsoncallback))
  61. {
  62. response.Write(")");
  63. }
  64. }
  65. }

7.调用

  1. http://localhost:6248/content/H5/58b92c3f2213028b202298209.json?_=1488857755563&callback=fn_58b92c3f2213028b22298209

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

  1. 思考ASP.NET网站静态化的利与弊

    最近在思考网站要不要进行静态化的问题,在网上收集和整理了有关静态化利与弊的资料,于是写下此博文分享到网络上.由于本人是一名asp.net开发人员,所以本文的观点可能无法涉及到全部方面,但是比较注重于使 ...

  2. ASP.NET MVC 插件化

    ASP.NET MVC 插件化机制 2015-03-14 22:25 by 杨康新, 1328 阅读, 15 评论, 收藏, 编辑 概述 nopCommerce的插件机制的核心是使用BuildMana ...

  3. asp.net mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开asp. ...

  4. ASP.NET MVC 插件化机制

    概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具 体实 ...

  5. ASP.NET MVC 静态资源打包和压缩问题小记

    ASP.NET MVC 中有个 BundleConfig 用于静态资源的打包和压缩,我在使用的过程中遇到一些问题,现在做下总结,并给出具体的解决方案. 问题一:打包压缩后的 JavaScript 和 ...

  6. MVC 静态化的ActionFilter

    在MVC中,需要对某些页面进行静态化,用ActionFilter来做静态化,把页面存到缓存中.如下代码所示,其中Result.RenderString是扩展方法,第一次缓存的时候,Action代码会运 ...

  7. asp.net 页面静态化

    页面静态化,有三种方式 伪静态  真静态,折中法  现在我做的是折中发 创建一个asp.net  页面,  连接跳转到还未生成的页面 创建HttpHandle类 using System;using ...

  8. spring mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开spri ...

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

    上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...

随机推荐

  1. 在Windows里定时执行一个Python文件

    一.系统环境 操作系统:Win7 64位 二.说明 1.建立一个dos批处理文件 例: @echo off C: cd C:\work\python python aaa.py exit 2.利用Wi ...

  2. ubuntu 安装两个版本的Anaconda

    1.下载anaconda2/anaconda3,下载地址:https://www.anaconda.com/download/#linux,anaconda官网如下所示,选择对应版本下载. 2.使用如 ...

  3. Mac下切换Python版本

    Mac下有多个版本的Python时,需要进行版本切换.我使用的是anaconda,在终端下进行包安装时,默认Python版本是MacOS自带的Python,需要进行手动的版本切换. # 将anacon ...

  4. keys()

    keys():返回一个数组,里面是符合匹配模式的键列表 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $pattern = ...

  5. js 清空 input[type=file]的值

    js 不能操作 input[type=file]但你可以将这个 input 的 dom 元素删除掉,再新增一个,或者替换掉 $("#UploadFile").replaceWith ...

  6. ios7 设置status bar风格

    How to change status bar style during launch on iOS 7 up vote4down votefavorite   When I launch my a ...

  7. Android Activity的切换动画(overridePendingTransition)

    overridePendingTransition 1.平时Activity的切换是就是从中间弹出来,然后遮盖住之前的Activity.这种效果看到很多后就想给他换成其他的效果,如: 要显示的Acit ...

  8. Spring中的用到的设计模式

    应该说设计模式是我们在写代码时候的一种被承认的较好的模式.好的设计模式就像是给代码造了一个很好的骨架,在这个骨架里,你可以知道心在哪里,肺在哪里,因为大多数人都认识这样的骨架,就有了很好的传播性.这是 ...

  9. 较为复杂的 GraphQL 查询实现

    一.实现功能首页各类排行榜加载数据: 向下遍历子节点并展开: 1.展开过程中动态加载简介summary.书类bookType: 2.book对象上包裹Rank节点,描述book对象在不同排行榜下所处位 ...

  10. lfs原理