【问题标题】:Transform Styles' Urls to CDN Urls in ASP.NET Bundling and Minification在 ASP.NET 捆绑和缩小中将样式的网址转换为 CDN 网址
【发布时间】:2015-01-25 02:38:10
【问题描述】:

我的一些样式在开发和阶段使用 url(../img/sprites/main_sprite.png) 到本地资源。但是在生产中,我使用 CDN,我所有的静态资源都在上面。是否可以转换捆绑包,以便将 .css 中的所有 url 替换为 cdn 路径?

例如:

.Logo {
background-image: url(../img/sprites/main_sprite.png);  
}

但是,在生产中我希望它是

.Logo {
background-image: url(http://MyCdn.com/img/sprites/main_sprite.png);    
}

我已经使用 CssRewriteUrlTransform() 将我的相对路径重写为绝对路径,所以资源捆绑后可以找到。

我想把这个类扩展成这样

public string Process(string includedVirtualPath, string input)
{

    if (_useCdn)
        {
             return  new CssRewriteUrlTransform().Process(_cdn + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);                           
        }
        else
        {
             return  new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);
        }

    }

但是Process必须有VirtualPath,否则我追加CDN路径时会抛出异常。

有没有这个类的等价物来重写带有CDN的URLS?

【问题讨论】:

    标签: asp.net asp.net-mvc bundling-and-minification asp.net-bundling


    【解决方案1】:

    我找不到现有的解决方案。因此,我使用 CssRewriteUrlTransform 代码作为我的 CDNStylesTransformer 的基础。希望对你也有用。

    /// <summary>
    /// Finds and Replaces Urls with CDN links.
    /// </summary>
    public class CDNStylesTransformer : IItemTransform
    {
        private bool _useCdn;
        private string _cdnBaseUrl;
        public CDNStylesTransformer(bool UseCDN, string CdnBaseUrl)
        {
            _useCdn = UseCDN;
            if(CdnBaseUrl == null || CdnBaseUrl.Equals(string.Empty))
            {
                throw new ArgumentNullException("CdnBaseUrl");
            }
            _cdnBaseUrl = CdnBaseUrl;
    
        }
    
        internal static string RebaseUrlToCDNUrl(string cdnUrl, string url)
        {
            // Don't do anything to invalid urls or absolute urls
            if (String.IsNullOrWhiteSpace(url) ||
                String.IsNullOrWhiteSpace(url) ||
                url.StartsWith("data:") ||
                   !VirtualPathUtility.IsAbsolute(url))
            {
                return url;
            }
    
            return cdnUrl + url;
        }
    
        internal static string ConvertUrlsToCDNUrl(string cdnUrl, string content)
        {
            if (String.IsNullOrWhiteSpace(content))
            {
                return content;
            }
            // Replace all urls with CDN urls
            Regex url = new Regex(@"url\(['""]?(?<url>[^)]+?)['""]?\)");
            return url.Replace(content, ((match) =>
            {
                return "url(" + RebaseUrlToCDNUrl(cdnUrl, match.Groups["url"].Value) + ")";
            }));
        }
    
        public  string Process(string includedVirtualPath, string input)
        {
            if (_useCdn) 
            {
    
                return ConvertUrlsToCDNUrl(_cdnBaseUrl, input);
            }
            else
            {
                return input; //do nothing 
    
            }
        }
    }
    

    在你的 BundleConfiguration 类中

    string cdnPath ="http://MyCdn.com";
    bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
          "~/Content/themes/base/style1.css", new CDNStylesTransformer(bundles.UseCdn,cdnPath)
          ));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多