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" });
注意:文件路径一定要放在 {WebRoot}/Content/H5/下面
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, , 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
asp.net mvc 静态化的更多相关文章
- 思考ASP.NET网站静态化的利与弊
最近在思考网站要不要进行静态化的问题,在网上收集和整理了有关静态化利与弊的资料,于是写下此博文分享到网络上.由于本人是一名asp.net开发人员,所以本文的观点可能无法涉及到全部方面,但是比较注重于使 ...
- ASP.NET MVC 插件化
ASP.NET MVC 插件化机制 2015-03-14 22:25 by 杨康新, 1328 阅读, 15 评论, 收藏, 编辑 概述 nopCommerce的插件机制的核心是使用BuildMana ...
- asp.net mvc 实战化项目之三板斧
laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开asp. ...
- ASP.NET MVC 插件化机制
概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具 体实 ...
- ASP.NET MVC 静态资源打包和压缩问题小记
ASP.NET MVC 中有个 BundleConfig 用于静态资源的打包和压缩,我在使用的过程中遇到一些问题,现在做下总结,并给出具体的解决方案. 问题一:打包压缩后的 JavaScript 和 ...
- MVC 静态化的ActionFilter
在MVC中,需要对某些页面进行静态化,用ActionFilter来做静态化,把页面存到缓存中.如下代码所示,其中Result.RenderString是扩展方法,第一次缓存的时候,Action代码会运 ...
- asp.net 页面静态化
页面静态化,有三种方式 伪静态 真静态,折中法 现在我做的是折中发 创建一个asp.net 页面, 连接跳转到还未生成的页面 创建HttpHandle类 using System;using ...
- spring mvc 实战化项目之三板斧
laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开spri ...
- Asp.Net MVC页面静态化功能实现二:用递归算法来实现
上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...
随机推荐
- 在Windows里定时执行一个Python文件
一.系统环境 操作系统:Win7 64位 二.说明 1.建立一个dos批处理文件 例: @echo off C: cd C:\work\python python aaa.py exit 2.利用Wi ...
- ubuntu 安装两个版本的Anaconda
1.下载anaconda2/anaconda3,下载地址:https://www.anaconda.com/download/#linux,anaconda官网如下所示,选择对应版本下载. 2.使用如 ...
- Mac下切换Python版本
Mac下有多个版本的Python时,需要进行版本切换.我使用的是anaconda,在终端下进行包安装时,默认Python版本是MacOS自带的Python,需要进行手动的版本切换. # 将anacon ...
- keys()
keys():返回一个数组,里面是符合匹配模式的键列表 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $pattern = ...
- js 清空 input[type=file]的值
js 不能操作 input[type=file]但你可以将这个 input 的 dom 元素删除掉,再新增一个,或者替换掉 $("#UploadFile").replaceWith ...
- ios7 设置status bar风格
How to change status bar style during launch on iOS 7 up vote4down votefavorite When I launch my a ...
- Android Activity的切换动画(overridePendingTransition)
overridePendingTransition 1.平时Activity的切换是就是从中间弹出来,然后遮盖住之前的Activity.这种效果看到很多后就想给他换成其他的效果,如: 要显示的Acit ...
- Spring中的用到的设计模式
应该说设计模式是我们在写代码时候的一种被承认的较好的模式.好的设计模式就像是给代码造了一个很好的骨架,在这个骨架里,你可以知道心在哪里,肺在哪里,因为大多数人都认识这样的骨架,就有了很好的传播性.这是 ...
- 较为复杂的 GraphQL 查询实现
一.实现功能首页各类排行榜加载数据: 向下遍历子节点并展开: 1.展开过程中动态加载简介summary.书类bookType: 2.book对象上包裹Rank节点,描述book对象在不同排行榜下所处位 ...
- lfs原理