19

Devo essere in grado di disabilitare temporaneamente il raggruppamento e la minimizzazione per una singola richiesta allo scopo di eseguire il debug dei problemi di JavaScript & JavaScript. Vorrei fare questo in fase di esecuzione con l'aggiunta di un parametro al QueryString in questo modo ..Come disabilitare temporaneamente bundling e minification in fase di esecuzione?

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

Ecco l'approccio sto considerando.

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; 
    } 
} 
  • Ci sono potenziali problemi con il fatto che io sono l'impostazione di questa proprietà statica su ogni richiesta web? (L'app Web verrà eseguita su una Web farm)
  • Ci sono modi migliori per gestire questo?
+2

Non vedo alcun errore, anche se mi consiglia di utilizzare un ActionFilter e pos memorizzando in modo sicuro la cache inserita/disinserita in una variabile cookie/sessione (finché non viene modificata richiamando 'DisableOptimizations = false'). –

+0

@BradChristie Adoro l'idea di archiviarlo in sessione! – jessegavin

risposta

9

Estendendo quello che ho detto in un commento:

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

poi, naturalmente, la sua attuazione sembra qualcosa di simile:

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

O, se si preferisce l'approccio hands-on:

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

Questo è davvero fantastico. Grazie mille. – jessegavin

+0

Avevo quasi finito di scrivere la mia implementazione in base al tuo commento, ma mi piace di più il tuo! – jessegavin

+0

fantastico - grazie, questo è ottimo –

Problemi correlati