6

Alcuni dei miei stili usano url (../ img/sprites/main_sprite.png) alle risorse locali in fase di sviluppo e di stage. Comunque in produzione io uso CDN e tutte le mie risorse statiche sono su di esso. È possibile trasformare i bundle in modo che tutti gli URL in .css vengano sostituiti con il percorso cdn?Trasforma gli URL degli stili in URL CDN in Bundle e Minimal ASP.NET

Per esempio:

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

Tuttavia, nella produzione vorrei che fosse

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

Uso già CssRewriteUrlTransform() per riscrivere i miei percorsi relativi ai assoluta, in modo che le risorse possono essere trovato dopo che hanno impacchettato.

Stavo pensando di estendere la classe come qualcosa di simile

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); 
     } 

    } 

Tuttavia, processo deve avere VirtualPath, altrimenti si genera un'eccezione quando aggiungo percorso CDN.

Esiste un equivalente di questa classe per riscrivere gli URL con CDN al suo interno?

risposta

2

Non è stato possibile trovare una soluzione esistente. Quindi, ho usato il codice CssRewriteUrlTransform come base per il mio CDNStylesTransformer. Spero possa essere utile anche per te.

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

     } 
    } 
} 

Nella classe 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) 
    ));