Prepend CDN url to MVC 4 bundler output

Używając wbudowanego bundlera MVC4, jak dodać adres URL CDN do tworzonych przez niego znaczników linków? Skonfigurowałem Amazon Cloudfront, aby pobierał zasoby z mojego serwera internetowego po pierwszym zapytaniu. Więc kiedy zdefiniuję Pakiet tak:

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

Po uruchomieniu mogę odnieść się do niego w ten sposób:

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

Teraz muszę tylko zmienić linki produkowane przez bundlera z względnych do bezwzględnych linków wskazujących na mój CDN.

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

Myślę, że możliwe jest przepisanie ścieżki za pomocą IBundleTransform, ale nie mogę znaleźć żadnych przykładów tego.

Uwaga: Dla jasności, wiem, że możesz określić łącze CDN dla pakietu, ale działa to tylko wtedy, gdy pakiet może zostać zastąpiony łączem statycznym.

Author: PeteG, 2013-02-12

3 answers

Właśnie skonfigurowałem MaxCDN i natknąłem się na ten sam problem.

Jak wiesz, właściwość bundles.UseCdn nie jest idealna, ponieważ nie chcemy podawać dokładnego adresu url pakietu. CDN jak Max CDN to ten sam dokładny adres url, ciąg zapytania i wszystkie, z wyjątkiem innej subdomeny.

Oto, Jak to rozwiązałem.

Utworzyłem klasę BundleHelper, która będzie owijać metodę renderowania, a następnie poprzedzać ścieżkę subdomeną CDN.

Oto jak wygląda Klasa like:

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

Następnie użyć go w widokach, po prostu zrobić:

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

@BundleHelper.RenderScript("~/bundles/jquery")
@BundleHelper.RenderScript("~/bundles/jqueryui")
Mam nadzieję, że to pomoże.
 6
Author: BigJoe714,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 22:23:09

Proszę zajrzeć @ używając CDN wyszukaj "używając CDN"

Jak powiedział Rick Anderson w asp.net/mvc,

Następujący kod zastępuje lokalny pakiet jQuery CDN jQuery / align = "left" /

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

W powyższym kodzie jQuery będzie wymagane z CDN podczas gdy w tryb wydania i wersja debugowania jQuery zostanie pobrana lokalnie w trybie debugowania. Podczas korzystania z CDN, należy mieć mechanizm awaryjny w przypadku CDN prośba nie powiodła się. Poniższy fragment znaczników z koniec pliku układu pokazuje skrypt dodany do żądania jQuery w przypadku CDN fail.

    </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 wklejono sekcję z Asp.net/MVC, w przypadku, gdy uznasz to za przydatne, Pozdrawiam Ricka Andersona za jego post...

 1
Author: Shubh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 20:08:42

Spójrz na moją odpowiedź na podobne pytanie tutaj: https://stackoverflow.com/a/18500359/725626

Opiera się na odpowiedzi BigJoe714 i prezentuje nieco inną alternatywę.

 1
Author: benmccallum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:12