在ASP.NET捆绑和缩小中将样式的URL转换为CDN URL

前端之家收集整理的这篇文章主要介绍了在ASP.NET捆绑和缩小中将样式的URL转换为CDN URL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的一些样式使用url(../ img / sprites / main_sprite.png)来开发和阶段中的本地资源.但是在生产中我使用CDN并且我的所有静态资源都在其上.是否有可能转换bundle以使.css中的所有url都被cdn路径替换?

例如:

  1. .logo {
  2. background-image: url(../img/sprites/main_sprite.png);
  3. }

但是,在制作中我希望如此

  1. .logo {
  2. background-image: url(http://MyCdn.com/img/sprites/main_sprite.png);
  3. }

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

我正在考虑将课程扩展为类似的东西

  1. public string Process(string includedVirtualPath,string input)
  2. {
  3.  
  4. if (_useCdn)
  5. {
  6. return new CssRewriteUrlTransform().Process(_cdn + VirtualPathUtility.ToAbsolute(includedVirtualPath),input);
  7. }
  8. else
  9. {
  10. return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath),input);
  11. }
  12.  
  13. }

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

是否有相应的这个类用它来重写带有CDN的URL?

解决方法

我无法找到现有的解决方案.所以,我使用CssRewriteUrlTransform代码作为我的CDNStylesTransformer的基础.我希望它对你也有用.
  1. /// <summary>
  2. /// Finds and Replaces Urls with CDN links.
  3. /// </summary>
  4. public class CDNStylesTransformer : IItemTransform
  5. {
  6. private bool _useCdn;
  7. private string _cdnBaseUrl;
  8. public CDNStylesTransformer(bool UseCDN,string CdnBaseUrl)
  9. {
  10. _useCdn = UseCDN;
  11. if(CdnBaseUrl == null || CdnBaseUrl.Equals(string.Empty))
  12. {
  13. throw new ArgumentNullException("CdnBaseUrl");
  14. }
  15. _cdnBaseUrl = CdnBaseUrl;
  16.  
  17. }
  18.  
  19. internal static string RebaseUrlToCDNUrl(string cdnUrl,string url)
  20. {
  21. // Don't do anything to invalid urls or absolute urls
  22. if (String.IsNullOrWhiteSpace(url) ||
  23. String.IsNullOrWhiteSpace(url) ||
  24. url.StartsWith("data:") ||
  25. !VirtualPathUtility.IsAbsolute(url))
  26. {
  27. return url;
  28. }
  29.  
  30. return cdnUrl + url;
  31. }
  32.  
  33. internal static string ConvertUrlsToCDNUrl(string cdnUrl,string content)
  34. {
  35. if (String.IsNullOrWhiteSpace(content))
  36. {
  37. return content;
  38. }
  39. // Replace all urls with CDN urls
  40. Regex url = new Regex(@"url\(['""]?(?<url>[^)]+?)['""]?\)");
  41. return url.Replace(content,((match) =>
  42. {
  43. return "url(" + RebaseUrlToCDNUrl(cdnUrl,match.Groups["url"].Value) + ")";
  44. }));
  45. }
  46.  
  47. public string Process(string includedVirtualPath,string input)
  48. {
  49. if (_useCdn)
  50. {
  51.  
  52. return ConvertUrlsToCDNUrl(_cdnBaseUrl,input);
  53. }
  54. else
  55. {
  56. return input; //do nothing
  57.  
  58. }
  59. }
  60. }

在BundleConfiguration类中

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

猜你在找的asp.Net相关文章