将CDN URL添加到mvc 4 bundler输出

Pet*_*teG 9 c# cdn asp.net-mvc-4 bundling-and-minification

使用内置的MVC4捆绑器,如何将我的CDN URL添加到它生成的链接标记中?我已经设置了Amazon Cloudfront,以便在首次请求时从我的网络服务器中提取资产.所以当我定义一个这样的包时:

 bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/reset.css",
    "~/Content/960_24_col.css",
    "~/Content/Site.css"
 ));
Run Code Online (Sandbox Code Playgroud)

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

http://[cloundfrontid].cloudfront.net/Content/css?v=muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1
Run Code Online (Sandbox Code Playgroud)

现在我只需要将Bundler生成的链接更改为相对于指向我的CDN的绝对链接.

  <link href="[INSERT_CDN_URL_HERE]/Content/css?v=muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

我认为可以使用IBundleTransform重写路径,但我找不到任何这方面的例子.

注意:为了清楚起见,我知道您可以为捆绑包指定CDN链接,但只有在捆绑包可以被静态链接替换时才有效.

Big*_*714 6

我刚刚设置了MaxCDN并遇到了同样的问题.

如您所知,该bundles.UseCdn属性并不理想,因为我们不希望必须为该包指定确切的URL.像Max CDN这样的CDN是完全相同的URL,查询字符串和所有,除了不同的子域.

这是我最终解决它的方式.

我创建了一个BundleHelper类,它将包装render方法,然后在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在视图中使用它,我只是这样做:

@BundleHelper.RenderStyle("~/Content/css")
@BundleHelper.RenderStyle("~/Content/themes/base/css")

@BundleHelper.RenderScript("~/bundles/jquery")
@BundleHelper.RenderScript("~/bundles/jqueryui")
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.