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

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

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 静态化的更多相关文章

  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. 2-python代码坑点

    #切片: # L = ['aaa', 'bbb', 'ccc', 'ddd'] # print(L[1 : 3]) #取[1, 3):下标 # L = list(range(100)) # print ...

  2. SqlServer-truncate && delete && drop 的区别

    有些人在删除表的所有记录的时候,喜欢这样来——不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除.但这种方法是不可取的,正确的应该使用 TRUNCATE TABLE tb_name ...

  3. Paper: ImageNet Classification with Deep Convolutional Neural Network

    本文介绍了Alex net 在imageNet Classification 中的惊人表现,获得了ImagaNet LSVRC2012第一的好成绩,开启了卷积神经网络在cv领域的广泛应用. 1.数据集 ...

  4. Cookie存中文乱码的问题

    有个奇怪的问题:登录页面中使用Cookie存值,Cookie中要存中文汉字.代码在本地调试,一切OK,汉字也能顺利存到Cookie和从Cookie中读出,但是放到服务器上不管用了,好好的汉字成了乱码, ...

  5. jqgrid常用操作

    .jqgrid控件列在需要的地方加上edittable=true <asp:JQGrid runat=" DataUrl="/ccr/CcrCompanyPromoterMa ...

  6. poj 1611 The Suspects(第一道并查集)

    题意: 有N个学生,编号为0-n-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染, 并且这些人如果还参加了别的社团,他所在的社团照样全部感染,社团个数为m,求感染的人数. 输入: n代表人 ...

  7. C#request和response的中文乱码问题

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码:   ...

  8. 编写高质量代码改善C#程序的157个建议——建议39:了解委托的实质

    建议39:了解委托的实质 理解C#中的委托需要把握两个要点: 1)委托是方法指针. 2)委托是一个类,当对其进行实例化的时候,要将引用方法作为它的构造方法的参数. 设想这样一个场景:在点对点文件传输过 ...

  9. Jquery hover 事件

    hover(over,out)一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法.这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态. 当鼠标移动到一个匹配的元素上面时 ...

  10. 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...