很多站点都是用了静态文件分离。我推荐一种处理静态文件分离的方式。

BundleExtensions.cs
 public static class BundleExtensions    {        public static string Version = "1.0.0";        public static string ScriptsPath = "Cdn";        public static Bundle Production(this Bundle bundle, string cdn, string root, string minified,            string full = "")        {            var transform = new ScriptsBundleTransform()            {                Version = Version,                ScriptsPath = System.IO.Path.Combine("~/", ScriptsPath, root),                Minified = minified,                Full = full            };            bundle.Transforms.Add(transform);            bundle.CdnPath = cdn + "/" + root + "/" + string.Format("{0}?{1}", minified, Version);            return bundle;        }    }

ScriptsBundleTransform.cs

public class ScriptsBundleTransform : IBundleTransform    {        public string ScriptsPath { get; set; }        public string Version { get; set; }        public string Minified { get; set; }        public string Full { get; set; }        public ScriptsBundleTransform()        {        }        public ScriptsBundleTransform(string path, string version, string minified, string full)        {            ScriptsPath = path;            Version = version;            Minified = minified;            Full = full;        }        public void Process(BundleContext context, BundleResponse response)        {            string scriptsRoot = context.HttpContext.Server.MapPath(ScriptsPath);            if (!Directory.Exists(scriptsRoot))                Directory.CreateDirectory(scriptsRoot);            //  if minified file name specified...            if (!string.IsNullOrEmpty(Minified))            {                using (TextWriter writer = File.CreateText(Path.Combine(scriptsRoot, Minified)))                {                    writer.Write(response.Content);                }            }            //  if full file name specified...            if (!string.IsNullOrEmpty(Full))            {                using (Stream writer = File.OpenWrite(Path.Combine(scriptsRoot, Full)))                {                    foreach (var file in response.Files)                    {                        file.VirtualFile.Open().CopyTo(writer);                    }                }            }        }    }

BundleConfig.cs

        public static void RegisterBundles(BundleCollection bundles)        {            bundles.UseCdn = true;            BundleTable.EnableOptimizations = true;            //制定压缩后的资源存储路径            BundleExtensions.ScriptsPath = "Resource";            //制定请求时代的后缀,为了刷新掉客户端的缓存            BundleExtensions.Version = "00001";            //CDN站点地址            const string ajaxCdnPath = "http://localhost/Cdn";            bundles.Add(new ScriptBundle("~/bundles/bootstrap")                .IncludeFallback("$.fn.affix",                    "~/Resource/Scripts/common/transition.js",                    "~/Resource/Scripts/common/button.js",                    "~/Resource/Scripts/common/affix.js",                    "~/Resource/Scripts/common/tab.js",                    "~/Resource/Scripts/common/collapse.js",                    "~/Resource/Scripts/common/tooltip.js",                    "~/Resource/Scripts/common/respond.js")                .Production(ajaxCdnPath, "Scripts", "bootstrap.mincdn.js", "bootstrap.src.js"));            bundles.Add(new ScriptBundle("~/Content/bootstrap")                .Include("~/Resource/Content/bootstrap.css")                .Include("~/Resource/Content/common/button.css")                .Include("~/Resource/Content/common/bootstrap-theme.css")                .Production(ajaxCdnPath, "Content", "bootstrap.mincdn.css", "bootstrap.src.css"));        }

这样的话就能生成 CDN 站点下的JS文件引用了

<script src="http://localhost/Cdn/Scripts/bootstrap.mincdn.js?00001"></script>

对了这里漏掉了一个地方,

http://localhost/Cdn站点需要你在IIS中指定到你站点的Resource下,不然访问不到你的JS文件。

但是如果CDN站点挂掉了怎么办,咱们继续:

SctiptsBundleExtensions.cs

    public static class SctiptsBundleExtensions    {        public static ScriptBundle IncludeFallback(this ScriptBundle bundle, string cdnFallbackExpression,            string virtualPath, params IItemTransform[] transforms)        {            bundle.CdnFallbackExpression = cdnFallbackExpression;            bundle.Include(virtualPath, transforms);            return bundle;        }        public static ScriptBundle IncludeFallback(this ScriptBundle bundle, string cdnFallbackExpression,          params string[] virtualPaths)        {            bundle.CdnFallbackExpression = cdnFallbackExpression;            bundle.Include(virtualPaths);            return bundle;        }    }
        bundles.Add(new ScriptBundle("~/bundles/jquery")                .IncludeFallback("window.jQuery", "~/Resource/Scripts/common/jquery-{version}.js")                .Production(ajaxCdnPath, "Scripts", "jquery.mincdn.js", "jquery.src.js"));

这样会生成如下的JS应用:

<script src="http://localhost/Cdn/Scripts/jquery.mincdn.js?00001"></script><script>(window.jQuery)||document.write('<script src="/dome/bundles/jquery"><//script>');</script>

这样的话当CDN站点挂掉了还是能够访问到JS文件的。

接下来CSS怎么处理呢:

StyleBundleExtensions.cs

 public static class StyleBundleExtensions    {        /// <summary>        /// Include a stylesheet to fallback to when external CdnPath does not load.        /// </summary>        /// <param name="bundle"></param>        /// <param name="fallback">Virtual path to fallback stylesheet</param>        /// <param name="className">Stylesheet class name applied to test DOM element</param>        /// <param name="ruleName">Rule name to test when the class is applied ie. width</param>        /// <param name="ruleValue">Value to test when the class is applied ie. 1px</param>        /// <returns></returns>        public static StyleBundle IncludeFallback(this StyleBundle bundle, string fallback,            string className = null, string ruleName = null, string ruleValue = null)        {            if (String.IsNullOrEmpty(bundle.CdnPath))            {                throw new Exception("CdnPath must be provided when specifying a fallback");            }            if (VirtualPathUtility.IsAppRelative(bundle.CdnPath))            {                bundle.CdnFallbackExpress(fallback);            }            else if (new[] { className, ruleName, ruleValue }.Any(String.IsNullOrEmpty))            {                throw new Exception(                    "IncludeFallback for cross-domain CdnPath must provide values for parameters [className, ruleName, ruleValue].");            }            else            {                bundle.CdnFallbackExpress(fallback, className, ruleName, ruleValue);            }            return bundle;        }        private static StyleBundle CdnFallbackExpress(this StyleBundle bundle, string fallback,            string className = null, string ruleName = null, string ruleValue = null)        {            bundle.Include(fallback);            fallback = VirtualPathUtility.ToAbsolute(fallback);            bundle.CdnFallbackExpression = String.IsNullOrEmpty(className) ?                String.Format(@"function() {{                var len = document.styleSheets.length;                for (var i = 0; i < len; i++) {{                    var sheet = document.styleSheets[i];                    if (sheet.href.indexOf('{0}') !== -1) {{                        var rules = sheet.rules || sheet.cssRules;                        if (rules.length <= 0) {{                            document.write('<link href=""{1}"" rel=""stylesheet"" type=""text/css"" />');                        }}                    }}                }}                return true;                }}()", bundle.CdnPath, fallback) :                String.Format(@"function() {{                var loadFallback,                    len = document.styleSheets.length;                for (var i = 0; i < len; i++) {{                    var sheet = document.styleSheets[i];                    if (sheet.href.indexOf('{0}') !== -1) {{                        var meta = document.createElement('meta');                        meta.className = '{2}';                        document.head.appendChild(meta);                        var value = window.getComputedStyle(meta).getPropertyValue('{3}');                        document.head.removeChild(meta);                        if (value !== '{4}') {{                            document.write('<link href=""{1}"" rel=""stylesheet"" type=""text/css"" />');                        }}                    }}                }}                return true;            }}()", bundle.CdnPath, fallback, className, ruleName, ruleValue);            return bundle;        }    }
好吧后面的大家自己摸索吧:)上班了
很多代码是网上抄袭的,东拼西凑。

asp.net mvc自动压缩文件,并生成CDN引用的更多相关文章

  1. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  2. [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传

    原文 [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传 Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件 ...

  3. ASP.NET MVC 导出CSV文件

    ASP.NET MVC   导出CSV文件.直接贴代码 /// <summary> /// ASP.NET MVC导出CSV文件Demo1 /// </summary> /// ...

  4. Asp.Net Mvc自定义控件之树形结构数据生成表格 - WPF特工队内部资料

    最近项目中有一个需求,将树形结构的数据,以表格的形式展示在页面中,下图是最终呈现效果: 源码: @{ Layout = null; } <!DOCTYPE html> <html&g ...

  5. Asp.Net MVC 文件管理Demo(文件展示,上传,下载,压缩,文件重命名等)

    之前 ,有想做一个文件管理页面. 参考了 许多资料,终于完成了一个基于Asp.net MVC 的文件管理Demo.界面如下.   一,实现功能及相关技术 文件管理Demo基于Asp.NET MVC , ...

  6. ASP.NET MVC下使用文件上传

    这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解压,将组件包拷贝到MVC项目中 3.  根目录下添加新 ...

  7. ASP.NET MVC实现Excel文件的上传下载

    在应用系统开发当中,文件的上传和下载是非常普遍的需求.在基于.NET的C/S架构的项目开发当中,有多种方案可以实现文件的上传和下载(httpwebrequest.webclient等),而且多采用异步 ...

  8. asp.net MVC 自动下载apk

    在Asp.net MVC中直接把.apk文件放入/Upload/App/ 路径下,然后通过IIS发布完之后,再通过http://xxx/Upload/App/xx.apk访问是访问不到的,因此不能下载 ...

  9. 用Fine Uploader+ASP.NET MVC实现ajax文件上传[代码示例]

    Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件的 Javascript 组件. This project attempts to achi ...

随机推荐

  1. UVALive 8519 Arrangement for Contests 2017西安区域赛H 贪心+线段树优化

    题意 等价于给一个数列,每次对一个长度为$K$的连续区间减一 为最多操作多少次 题解: 看样例猜的贪心,10分钟敲了个线段树就交了... 从1开始,找$[i,i+K]$区间的最小值,然后区间减去最小值 ...

  2. $Django cookies与session--解决无连接无状态问题, session配置

    session作用: 会话保持,记住用户的登录状态(WEB网站,分布式架构) 作用(和cookie的区别) 避免了敏感信息保存在客户端,防止客户端修改cookie信息! -cookie:存储在客户端浏 ...

  3. Sublime Text 3安装Package Control快速建立html5和xhtml文档

    Sublime Text 3安装Package Control快速建立html5和xhtml文档 先关闭Sublime text 3:第1步:下载sublime_package_control-mas ...

  4. 修改svn默认端口

    Subversion有两种不同的配置方式,一种基于它自带的轻量级服务器svnserve,一种基于非常流行的Web服务器Apache. 根据不同的配置方式,Subversion使用不同的端口对外提供服务 ...

  5. Linux系统基础优化及常用命令

    Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和 ...

  6. [JavaScript]使用ArrayBuffer和Blob编辑二进制流

    Blob()构造方法返回一个新的Blob对象. 内容是包含参数array的二进制字节流. 语法 var aBlob = new Blob( array, options ); 参数 array is ...

  7. HSSFClientAnchor 参数说明

    pache POI  是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. HSSFClient ...

  8. Confluence 6 管理应用服务器内存设置

    应用服务器中的最小和最大 JVM Heap 空间配置将会影响系统的性能.Confluence 管理员可能希望对默认的配置进行修改,基于你系统的负载不同配置情况也会有所不同,请参考页面 Server H ...

  9. Confluence 6 使用 Apache 的 mod_jk

      在 Confluence 6 及其后续版本中,不能使用 mod_jk 来做代理.这是因为 Synchrony 服务导致的这个限制. Synchrony 在协同编辑的时候需要启动,同时还不能接受 A ...

  10. Confluence 6 XML 备份失败的问题解决

    XML 站点备份仅仅被用于整合到一个新的数据库.设置一个测试服务器 或者 创建一个可用的备份策略 相对 XML 备份来说是更合适的策略. 相关页面: Enabling detailed SQL log ...