How to upload bundled and minified files to Windows Azure CDN

asp.net-mvc-4, asp.net-optimization, azure, bundling-and-minification, cdn

Solution

So there isn't a great way to do this currently. The longer term workflow we are envisioning is adding build-time bundling support. Then you would run a build task (or run an exe if you prefer) to generate the bundles and then be able to upload these to the AzureCDN. Finally, you just turn on UseCDN on the BundleCollection, and the Script/Style helpers would just automatically switch to rendering out links to your AzureCDN with proper fallback to your local bundles.

For the short term, what I think you are trying to do is upload your bundle to the AzureCDN when the bundle is first constructed?

A BundleTransform is one way to do it I guess, its a bit of a hack, but you could add a BundleTransform last in your bundle. Since its last, the BundleResponse.Content is effectively the final bundle response. At that point in time you can upload it to your CDN. Does that make sense?

Problem

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")`). I'd like to use it in combination with a Windows Azure CDN. I looked into writing a custom `BundleTransform` but the content is not optimized there yet. I also looked into parsing and uploading the optimized stream on runtime but that feels like a hack to me and I don't really like it: ``` @StylesCdn.Render(Url.AbsoluteContent( Styles.Url("~/content/static/css").ToString() )); public static IHtmlString Render(string absolutePath) { // get the version hash string versionHash = HttpUtility.ParseQueryString( new Uri(absolutePath).Query ).Get("v"); // only parse and upload to CDN if version hash is different if (versionHash != _versionHash) { _versionHash = versionHash; WebClient client = new WebClient(); Stream stream = client.OpenRead(absolutePath); UploadStreamToAzureCdn(stream); } var styleSheetLink = String.Format( "<link href=\"{0}://{1}/{2}/{3}?v={4}\" rel=\"stylesheet\" type=\"text/css\" />", cdnEndpointProtocol, cdnEndpointUrl, cdnContainer, cdnCssFileName, versionHash ); return new HtmlString(styleSheetLink); } ``` How can I upload the bundled and minified versions automatically to my Windows Azure CDN?

Original source