我正在用ASP.NET MVC3进行开发和应用。我计划利用Amazons Cloudfront产品作为CDN来服务静态资产。
我很好奇,有没有人想出一种简单的方法来在用于开发的本地资产和用于部署的基于CDN的资产之间切换?
任何技巧或技巧都将非常感谢。
发布于 2012-02-21 05:43:48
与保罗的答案相似。
在过去,我对UrlHelper使用了一种扩展方法,它根据web.config的值创建链接。
这很有帮助,因此您不必在发布后缩小视图,而且它就像在发布时更新web.config条目一样简单。任何需要使用CDN资源的资源,您只需说Url.CdnContent("~/site.css")
我现在不在我的开发pc上,但当我回到家时,我会给你我的扩展方法的源代码
它非常简单,但它能满足我的需求
public static string CdnContent(this UrlHelper helper, string relativePath)
{
var cdnRoot = ConfigurationManager.AppSettings["cygnus.cdnroot"];
if (string.IsNullOrEmpty(cdnRoot))
return UrlHelper.GenerateContentUrl(relativePath, helper.RequestContext.HttpContext);
if (relativePath.StartsWith("~"))
relativePath = relativePath.Substring(1);
if (cdnRoot.EndsWith("/"))
cdnRoot = cdnRoot.Substring(0, cdnRoot.Length - 1);
if (!relativePath.StartsWith("/"))
relativePath = "/" + relativePath;
return cdnRoot + relativePath;
}发布于 2012-02-21 01:29:25
我以前用几条简单的规则就做到了:
Url.Content中使用应用程序相对路径,即.Url.Content("~/content/file.jpg"))然后在我的部署过程中,我可以简单地将所有静态资产从站点复制到CDN,CSS将工作,因为它是相对的(CSS url()值总是相对于它们所在的CSS文件,而不是请求),并且我将使用正则表达式来替换视图中的任何字符串,这些字符串的形式应该是CDN的基本路径。
发布于 2012-02-21 02:11:42
问得好。我建议你使用条件编译变量。
如果您的项目处于调试模式,则将链接本地资产。如果您的项目处于CDN发布模式,则会链接CDN资产。
下面是一个示例:
<head runat="server">
<% #if DEBUG %>
<link rel="stylesheet" type="text/css" href="/Assets/Styles/Default.css" />
<% #else %>
<link rel="stylesheet" type="text/css" href="http://cdn.mysite.com/Assets/Styles/Default.css" />
<% #endif %>
</head>但是要小心,当你发布你的项目时,它应该处于发布模式。有一次,我更新了我的一个项目,它处于调试模式,一切都出错了。
下面是一些关于条件编译的很好的链接:
http://haacked.com/archive/2007/09/16/conditional-compilation-constants-and-asp.net.aspx
http://odetocode.com/blogs/scott/archive/2005/12/01/conditional-compilation-in-asp-net-2-0.aspx
http://odetocode.com/blogs/scott/archive/2007/09/24/more-on-conditional-compilation-in-asp-net.aspx
https://stackoverflow.com/questions/9365191
复制相似问题