为mvc 4捆绑器输出准备CDN url

本文关键字:CDN url 输出 mvc | 更新日期: 2023-09-27 17:58:54

使用内置的MVC4捆绑器,如何将我的CDN url预先设置为它生成的链接标签?我已经设置了AmazonCloudfront,以便它在第一次请求时从我的Web服务器中提取资产。所以当我定义这样的捆绑包时:

 bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/reset.css",
    "~/Content/960_24_col.css",
    "~/Content/Site.css"
 ));

当部署时,我可以这样引用它:

http://[cloundfrontid].cloudfront.net/Content/css?v=muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1

现在我只需要将bundler生成的链接从相对链接更改为指向我的CDN的绝对链接。

  <link href="[INSERT_CDN_URL_HERE]/Content/css?v=muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1" rel="stylesheet"/>

我认为使用IBundleTransform重写路径是可能的,但我找不到任何这样的例子。

注意:需要明确的是,我知道你可以为捆绑包指定CDN链接,但只有当捆绑包可以被静态链接取代时,这才有效。

为mvc 4捆绑器输出准备CDN url

我刚刚安装了MaxCDN,遇到了同样的问题。

正如您所知,bundles.UseCdn属性并不理想,因为我们不想为捆绑包指定确切的url。像Max CDN这样的CDN是完全相同的url、查询字符串和所有内容,除了不同的子域。

以下是我最终解决问题的方法。

我创建了一个BundleHelper类,该类将包装呈现方法,然后用CDN子域预先准备路径。

这是类的样子:

namespace MyDomain.Web.Helpers
{
    public class BundleHelper
    {
        public static string CdnPath = "http://cdn.mydomain.com";
        public static IHtmlString RenderScript(string path)
        {
            var opt = System.Web.Optimization.Scripts.Render(path);
            string htmlString = HttpUtility.HtmlDecode(opt.ToHtmlString());
            if (BundleTable.EnableOptimizations)
            {
                htmlString = htmlString.Replace("<script src='"/", String.Format("<script src='"{0}/", CdnPath));
            }
            return new HtmlString(htmlString);
        }
        public static IHtmlString RenderStyle(string path)
        {
            var opt = System.Web.Optimization.Styles.Render(path);
            string htmlString = HttpUtility.HtmlDecode(opt.ToHtmlString());
            if (BundleTable.EnableOptimizations)
            {
                htmlString = htmlString.Replace("<link href='"/", String.Format("<link href='"{0}/", CdnPath));
            }
            return new HtmlString(htmlString);
        }
    }
}

然后在视图中使用它,我只需:

@BundleHelper.RenderStyle("~/Content/css")
@BundleHelper.RenderStyle("~/Content/themes/base/css")
@BundleHelper.RenderScript("~/bundles/jquery")
@BundleHelper.RenderScript("~/bundles/jqueryui")

希望这能有所帮助。

请查看@使用CDN搜索"使用CDN"

正如Rick Anderson在asp.net/mvc中所说,

以下代码将本地jQuery捆绑包替换为CDN jQuery捆

    public static void RegisterBundles(BundleCollection bundles)
    {
    //bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    //            "~/Scripts/jquery-{version}.js"));
    bundles.UseCdn = true;   //enable CDN support
    //add link to jquery on the CDN
    var jqueryCdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js";
    bundles.Add(new ScriptBundle("~/bundles/jquery",
                jqueryCdnPath).Include(
                "~/Scripts/jquery-{version}.js"));
    // Code removed for clarity.
    }

在上面的代码中,jQuery将在jQuery的发布模式和调试版本将在本地获取处于调试模式。使用CDN时,您应该有一个后备机制以防CDN请求失败。中的以下标记片段布局文件的末尾显示添加到请求jQuery的脚本CDN失败。

    </footer>
        @Scripts.Render("~/bundles/jquery")
        <script type="text/javascript">
            if (typeof jQuery == 'undefined') {
                var e = document.createElement('script');
                e.src = '@Url.Content("~/Scripts/jquery-1.7.1.js")';
                e.type = 'text/javascript';
                document.getElementsByTagName("head")[0].appendChild(e);
            }
        </script> 
        @RenderSection("scripts", required: false)
    </body>
</html>

在已经粘贴了Asp.net/MVC的部分,如果你觉得它有用,那么为Rick Anderson的帖子干杯。。。