Search code examples
c#asp.netasp.net-mvcasp.net-optimizationbundling-and-minification

How to temporarily disable bundling and minification at runtime?


I need to be able to temporarily disable bundling and minification for a single request for the purpose of debugging JavaScript & CSS Issues. I would like to do this at run time by adding a parameter to the QueryString like so..

http://domain.com/page?DisableOptimizations=true

Here's the approach I am considering.

protected void Application_BeginRequest(object sender, EventArgs e)
{
  // Enable for every request
  BundleTable.EnableOptimizations = true;

  // Disable for requests that explicitly request it
  bool disable;
  bool.TryParse(Context.Request.QueryString["DisableOptimizations"], out disable);
  if (disable)
  {
    BundleTable.EnableOptimizations = false;
  }
}
  • Are there any potential issues with the fact that I am setting this static property on every web request? (The web app will run on a web farm)
  • Are there better ways to handle this?

Solution

  • Extending what I mentioned in a comment:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class OptimizationsDebuggingAttribute : ActionFilterAttribute
    {
        private const String PARAM_NAME = "DisableOptimizations";
        private const String COOKIE_NAME = "MySite.DisableOptimizations";
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Boolean parsedPref;
            Boolean optimizationsDisabled = false;
    
            if (filterContext.HttpContext.Request.QueryString[PARAM_NAME] != null)
            { // incoming change request
                var pref = filterContext.HttpContext.Request.QueryString[PARAM_NAME].ToString();
                if (Boolean.TryParse(pref, out parsedPref))
                {
                    optimizationsDisabled = parsedPref;
                }
            }
            else
            { // use existing settings
                var cookie = filterContext.HttpContext.Request.Cookies[COOKIE_NAME];
                if (cookie != null && Boolean.TryParse(cookie.Value, out parsedPref))
                {
                    optimizationsDisabled = parsedPref;
                }
            }
    
            // make the change
            System.Web.Optimization.BundleTable.EnableOptimizations = !optimizationsDisabled;
    
            // save for future requests
            HttpCookie savedPref = new HttpCookie(COOKIE_NAME, optimizationsDisabled.ToString())
            {
                Expires = DateTime.Now.AddDays(1)
            };
            filterContext.HttpContext.Response.SetCookie(savedPref);
    
            base.OnActionExecuting(filterContext);
        }
    }
    

    then of course implementing it looks something like:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new OptimizationsDebuggingAttribute());
    }
    

    Or, if you prefer the hands-on approach:

    [OptimizationsDebugging]
    public ActionResult TroublesomeAction()
    {
        return View();
    }