2013-02-12 18 views
9

組み込みのMVC4バンドラーを使用して、CDN URLを生成するリンクタグにどのように追加するのですか? Amazon Cloudfrontをセットアップして、最初にリクエストしたときにWebサーバーからアセットを取得します。展開されたとき、私はこのようにそれを参照することができますmvc 4バンドル出力の先頭にCDN urlを追加

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 

を今私はちょうど絶対リンクに相対であることからバンドラによって生成リンクを変更する必要があります私のCDNを指しています。

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

私はIBundleTransformを使用してパスを書き換えることが可能かもしれないと思うが、私は、この任意の例を見つけることができません。

NOTE: バンドルのCDNリンクを指定することはできますが、バンドルを静的リンクで置き換えることができる場合にのみ有効です。 asp.net/mvcにすることでリック・アンダーソンで述べたよう

+0

CDNに静的リンクを使用できないのはなぜですか? –

+0

私はそのリンクがコンパイル時にどのようになるかわからないので。バンドラは、それをキャッシュ無効化文字列で動的に割り当てる。/Content/css?v = muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1 – PeteG

+0

あなたのCDNは実際に返すコンテンツを切り替えるためにクエリ文字列を実際に使用していますか?バージョンをCDNに明示的にハードコードできませんでしたか?つまり/ content/css1となり、バンドルをリバースするたびにバンプするだけですか? –

答えて

6

をAsp.net/MVCからセクションを貼り付けに走ってきました同じ正確な問題。

ご存知のように、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") 

・ホープ、このことができます。

+1

それは私を助けます。 –

+1

私はそれを試していないが、これは良い解決策のように見えます。最後に私は[私のブログで](http://www.peteg.eu/blog/2013/03/15/using-mvc4-bundler-with-a-content-delivery-network/) 。私はより効率的であるため、あなたの名前を受け入れたものとしてマークします。 – PeteG

+0

こんにちはBigJoe:cdn urlをbundlerの出力に追加したいと思います。記述したのと同じことをしましたが、ViewPagesで行ったことを理解できませんでした。説明していただけますか? – Ankita

1

を「CDNを使用する」ためのUsing a CDN検索@を見てください次のコードは、ローカルでの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を使用する場合は、CDN要求が失敗した場合の代替メカニズム が必要です。レイアウトファイルの末尾にある の次のマークアップフラグメントは、 CDNが失敗した場合にjQueryを要求するスクリプトを追加したものです。

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

では、私はちょうどセットアップMaxCDN ...あなたは彼のポストのためのリック・アンダーソンにそれが役に立つその後、乾杯見つける場合には、

+0

Ooops its a Feb、12投稿: – Shubh

関連する問題