How to upload bundled and minified files to Windows Azure CDN

前端 未结 4 1590
感动是毒
感动是毒 2020-12-07 16:50

I\'m using the ASP.NET MVC 4 bundling and minifying features in the Microsoft.AspNet.Web.Optimization namespace (e.g. @Styles.Render(\"~/content/static/css\")).

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-07 17:45

    Following Hao's advice I Extended Bundle and IBundleTransform.

    Adding AzureScriptBundle or AzureStyleBundle to bundles;

    bundles.Add(new AzureScriptBundle("~/bundles/modernizr.js", "cdn").Include("~/Scripts/vendor/modernizr.custom.68789.js"));
    

    Results in;

    
    

    If CdnHost isn't set it will use the Uri of the blob instead of the CDN.

    Class

    using System;
    using System.Text;
    using System.Web;
    using System.Web.Optimization;
    using System.Security.Cryptography;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.ServiceRuntime;
    using Microsoft.WindowsAzure.StorageClient;
    
    namespace SiegeEngineWebRole.BundleExtentions
    {
        public class AzureScriptBundle : Bundle
        {
            public AzureScriptBundle(string virtualPath, string containerName, string cdnHost = "")
                : base(virtualPath, null, new IBundleTransform[] { new JsMinify(), new AzureBlobUpload { ContainerName = containerName, CdnHost = cdnHost } })
            {
                ConcatenationToken = ";";
            }
        }
    
        public class AzureStyleBundle : Bundle
        {
            public AzureStyleBundle(string virtualPath, string containerName, string cdnHost = "")
                : base(virtualPath, null, new IBundleTransform[] { new CssMinify(), new AzureBlobUpload { ContainerName = containerName, CdnHost = cdnHost } })
            {
            }
        }
    
        public class AzureBlobUpload : IBundleTransform
        {
            public string ContainerName { get; set; }
            public string CdnHost { get; set; }
    
            static AzureBlobUpload()
            {
            }
    
            public virtual void Process(BundleContext context, BundleResponse response)
            {
                var file = VirtualPathUtility.GetFileName(context.BundleVirtualPath);
    
                if (!context.BundleCollection.UseCdn)
                {
                    return;
                }
                if (string.IsNullOrWhiteSpace(ContainerName))
                {
                    throw new Exception("ContainerName Not Set");
                }
    
                var conn = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("DataConnectionString"));
                var blob = conn.CreateCloudBlobClient()
                    .GetContainerReference(ContainerName)
                    .GetBlobReference(file);
    
                blob.Properties.ContentType = response.ContentType;
                blob.UploadText(response.Content);
    
                var uri = string.IsNullOrWhiteSpace(CdnHost) ? blob.Uri.AbsoluteUri.Replace("http:", "").Replace("https:", "") : string.Format("//{0}/{1}/{2}", CdnHost, ContainerName, file);
    
                using (var hashAlgorithm = CreateHashAlgorithm())
                {
                    var hash = HttpServerUtility.UrlTokenEncode(hashAlgorithm.ComputeHash(Encoding.Unicode.GetBytes(response.Content)));
                    context.BundleCollection.GetBundleFor(context.BundleVirtualPath).CdnPath = string.Format("{0}?v={1}", uri, hash);
                }
            }
    
            private static SHA256 CreateHashAlgorithm()
            {
                if (CryptoConfig.AllowOnlyFipsAlgorithms)
                {
                    return new SHA256CryptoServiceProvider();
                }
    
                return new SHA256Managed();
            }
        }
    }
    

提交回复
热议问题