使用内置的 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
现在我只需要更改捆绑器生成的链接,使其不再是相对于指向我的 CDN 的绝对链接。
<link href="[INSERT_CDN_URL_HERE]/Content/css?v=muhFMZ4thy_XV3dMI2kPt-8Rljm5PNW0tHeDkvenT0g1" rel="stylesheet"/>
我认为可以使用 IBundleTransform 重写路径,但我找不到任何示例。
笔记:
需要明确的是,我知道您可以为捆绑包指定 CDN 链接,但只有当捆绑包可以替换为静态链接时才有效。
我刚刚设置 MaxCDN 并遇到了同样的问题。
如您所知,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")
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)