19

Ich muss in der Lage sein, die Bündelung und die Verkleinerung für eine einzelne Anfrage für das Debuggen von JavaScript & CSS-Problemen vorübergehend zu deaktivieren. Ich möchte dies zur Laufzeit tun, indem Sie einen Parameter an die Abfrage-Zeichenfolge wie so Hinzufügen ..Wie kann die Bündelung und Minifizierung zur Laufzeit vorübergehend deaktiviert werden?

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

Hier ist der Ansatz, den ich überlege.

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; 
    } 
} 
  • Gibt es mögliche Probleme mit der Tatsache, dass ich auf jeder Web-Anfrage diese statische Eigenschaft setze? (Die Webanwendung wird auf einer Webfarm ausgeführt.)
  • Gibt es bessere Möglichkeiten, damit umzugehen?
+2

Ich sehe keinen Fehler, obwohl ich einen ActionFilter und pos Das zwischengespeicherte on/off wird in einer Cookie/Sitzungsvariablen gespeichert (bis es durch Abrufen von 'DisableOptimizations = false' geändert wird). –

+0

@BradChristie Ich liebe die Idee, es in Sitzung zu speichern! – jessegavin

Antwort

9

erweitern, was ich in einem Kommentar erwähnt:

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

dann natürlich deren Umsetzung etwas wie folgt aussieht:

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

Oder, wenn Sie den praktischen Ansatz bevorzugen:

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

Das ist wirklich genial. Danke vielmals. – jessegavin

+0

Ich war fast fertig damit, meine eigene Implementierung basierend auf deinem Kommentar zu schreiben, aber ich mag deine mehr! – jessegavin

+0

genial - danke, das ist toll –

Verwandte Themen