6

내 스타일 중 일부는 url (../ img/sprites/main_sprite.png)을 개발 및 스테이지의 로컬 리소스에 사용합니다. 그러나 프로덕션에서는 CDN을 사용하며 정적 리소스가 모두 있습니다. .css의 모든 URL이 cdn 경로로 바뀌도록 번들을 변환 할 수 있습니까? 예를 들어변환 스타일 ASP.NET의 URL을 CDN URL로 변환 번들링 및 축소

는 :

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

    } 

처럼 무언가로 클래스를 확장 할 생각

, 프로세스 내가 CDN 경로를 추가 할 때 그렇지 않으면 예외가 발생, VirtualPath이 있어야합니다.

URL에 CDN을 다시 쓰려면이 클래스에 해당하는 항목이 있습니까?

답변

2

기존 솔루션을 찾을 수 없습니다. 그래서, 나는 CDNStylesTransformer의 기초로 CssRewriteUrlTransform 코드를 사용했다. 나는 그것이 당신에게도 도움이되기를 바랍니다. 당신의 BundleConfiguration 클래스에서

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

     } 
    } 
} 

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