2013-02-12 13 views
9

Mit dem integrierten MVC4-Bundler, wie stelle ich meine CDN-URL den Link-Tags voran, die sie erzeugt? Ich habe Amazon Cloudfront so eingerichtet, dass Assets bei der ersten Anforderung von meinem Webserver abgerufen werden. Also, wenn ich ein Bündel definieren wie folgt:CDN-URL an MPC anfügen 4 Bundler-Ausgabe

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

Wenn eingesetzt, kann ich es so Referenz:

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

nun durch die Bündler von produzierte ich muss nur die Links ändern ist in Bezug auf absolute Links auf mein CDN zeigen.

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

Ich denke, dass es möglich sein kann, den Weg neu zu schreiben, mit IBundleTransform aber ich kann keine Beispiele dafür finden.

HINWEIS: Nur um klar zu sein, ich weiß, dass Sie einen CDN-Link für ein Bündel angeben können, aber das funktioniert nur, wenn das Bündel durch eine statische Verknüpfung ersetzt werden kann.

+0

Warum können Sie keine statische Verbindung zu Ihrem CDN verwenden? –

+0

, weil ich nicht weiß, was dieser Link zur Kompilierzeit sein wird. Der Bündler weist ihm dynamisch eine Cache-Busting-Zeichenfolge zu, z./Content/css? V = muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1 – PeteG

+0

Ihr CDN verwendet tatsächlich die Abfragezeichenfolge, um einzuschalten, welchen Inhalt es zurückgibt? Könnten Sie nicht einfach die Versionen explizit in Ihr CDN codieren? also/content/css1 und stoße es einfach jedes Mal, wenn du deine Bündel aktualisierst? –

Antwort

6

ich gerade Setup MaxCDN und lief in die Das gleiche genaue Problem.

Wie Sie wissen, ist die Eigenschaft bundles.UseCdn nicht ideal, da wir nicht die genaue URL für das Bundle angeben müssen. Ein CDN wie Max CDN ist die gleiche genaue URL, Query-String und alle, mit Ausnahme einer anderen Subdomain.

Hier ist, wie ich es gelöst habe.

Ich habe eine BundleHelper Klasse erstellt, die die render-Methode umschließt und dann den Pfad mit der CDN-Subdomäne voranstellt.

Hier ist, was die Klasse wie folgt aussieht:

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); 
     } 
    } 
} 

Dann ist es in den Ansichten zu verwenden, habe ich einfach tun:

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

@BundleHelper.RenderScript("~/bundles/jquery") 
@BundleHelper.RenderScript("~/bundles/jqueryui") 

Hoffnung, das hilft.

+1

Es hilft mir sehr. –

+1

Ich habe es nicht versucht, aber das sieht nach einer guten Lösung aus. Am Ende ging ich mit der skizzierten Lösung [auf meinem Blog] (http://www.peteg.eu/blog/2013/03/15/using-mvc4-bundler-with-a-content-delivery-network/) . Ich werde deine als akzeptiert markieren, weil es effizienter ist. – PeteG

+0

Hallo BigJoe: Ich möchte auch cdn url Bundler Ausgabe voranstellen .. und ich habe das gleiche getan, wie Sie beschrieben haben, habe ich nicht verstanden, was Sie in ViewPages getan haben. Kannst du bitte Erklären? – Ankita

1

haben Sie einen Blick @Using a CDN Suche "ein CDN verwenden"

sagte Wie von Rick Anderson in asp.net/mvc,

Die Folge Code mit einem der lokalen jQuery bündeln ersetzt CDN jQuery Bündel.

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. 
    } 

In dem obigen Code wird jQuery vom CDN angefordert werden, während in Release-Modus und die Debug-Version von jQuery lokal im Debug-Modus geholt werden. Bei Verwendung eines CDN sollten Sie einen Fallback-Mechanismus für den Fall, dass die CDN-Anfrage fehlschlägt, haben. Das folgende Markup-Fragment aus dem -Ende der Layoutdatei zeigt, dass das Skript zur Anforderung von jQuery hinzugefügt wurde, falls der CDN-Code fehlschlägt.

</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> 

In dem Abschnitt von Asp.net/MVC eingefügt haben, falls Sie es nützlich finden dann Prost Rick Anderson für seinen Posten ...

+0

Hoppla, es ist ein Feb 12 Post :) – Shubh