将CDN URL添加到mvc 4 bundler输出

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

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的绝对链接。

   

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

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

我只是设置了MaxCDN并遇到了同样的问题。

如您所知, bundles.UseCdn属性并不理想,因为我们不希望必须为bundle指定确切的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("

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

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

希望这可以帮助。

请看看@ 使用CDN搜索“使用CDN”

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

以下代码用CDN jQuery包替换本地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. } 

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

   @Scripts.Render("~/bundles/jquery")  @RenderSection("scripts", required: false)   

已经粘贴了Asp.net/MVC的部分,如果你发现它有用,那么干杯给Rick Anderson的post……

在这里看看我对类似问题的回答: https : //stackoverflow.com/a/18500359/725626

建立在BigJoe714的答案上,并提出了一个略有不同的选择。