好吧,我想出了涉及URL重寫和一個自定義的HTML幫助一個體面的解決辦法。
的web.config:
<rule name="BundlingRewrite" stopProcessing="true">
<match url="^content/min/([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="content/min/{R:1}?v={R:2}" />
</rule>
幫手:
public static IHtmlString RenderCdnCss(this HtmlHelper helper, params string[] paths)
{
if (BundleTable.EnableOptimizations)
{
StringBuilder sb = new StringBuilder();
Uri baseUri = helper.ViewContext.HttpContext.Request.Url;
foreach (string s in paths) {
Uri uri = new Uri(baseUri, BundleTable.Bundles.ResolveBundleUrl(s));
sb.AppendFormat("<link href=\"{0}\" rel=\"stylesheet\"/>", uri.PathAndQuery.Replace("?v=", "/"));
}
return new HtmlString(sb.ToString());
}
return Styles.Render(paths);
}
助手翻譯捆綁網址爲更CDN友好。例如:?
/內容/分鐘/ CSS V = 3GWBEyScjC610oPQm0JVybboQ_EmX3StAuCZjd_B7bE1
變得
/內容/分鐘/ CSS/3GWBEyScjC610oPQm0JVybboQ_EmX3StAuCZjd_B7bE1
URL重寫(IIS URL重寫2.0)尋找一個(某些文件夾)並將其重寫爲content/min/{某個文件夾}?v = {某個標記}(默認路徑看起來如此)
因此,捆綁器是不明智的,路徑是來CDN友好。在我的情況下,我也會在網址的前面添加cdn url,但這不包括在上面。
我可能不在,但我不確定與其他人有什麼關係? MVC捆綁將收集要捆綁的文件,捆綁它們並從Web服務器返回它們,而不是從實際的CDN返回。據我所知,你不能在你的網絡應用程序之外存儲這些軟件包(如果可以的話,那將會很棒,請糾正我)。如果你想讓你的壓縮文件在你的網頁應用程序之外,我想你需要手動壓縮你的項目。 – Tommy 2013-05-10 14:44:07
@Tommy如果CDN沒有將其放入緩存中,則該CDN從源中拉取。一個請求http://cdn.mysite.com/content/css/min.css會去CDN,它不在那裏,CDN會從源請求 - 這是.net進入的地方。你不會推到CDN,它會從你身上拉開。 – ScottE 2013-05-10 14:53:44
哦,我看到你現在問的是什麼,我正在相反的文件流向看你的問題。我的錯。我以爲你在問捆綁過程的實際拉動,而不是分配捆綁的CDN。 – Tommy 2013-05-10 14:56:06