19

Muszę być w stanie tymczasowo wyłączyć pakowanie i zminimalizowanie dla pojedynczego żądania w celu debugowania JavaScript & Problemy z CSS. Chciałbym to zrobić w czasie wykonywania przez dodanie parametru do QueryString jak tak ..Jak tymczasowo wyłączyć pakowanie i zminimalizowanie w czasie wykonywania?

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

Oto podejście jestem rozważa.

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; 
    } 
} 
  • Czy istnieją jakieś potencjalne problemy związane z faktem, że jestem Ustawienie tej właściwości statyczne na każde żądanie WWW? (Aplikacja internetowa będzie działać na farmie internetowej)
  • Czy istnieją lepsze sposoby radzenia sobie z tym?
+2

Nie widzę żadnej usterki, ale polecam używanie ActionFiltera i pos racjonalne przechowywanie w pamięci podręcznej włącz/wyłącz w zmiennej cookie/session (dopóki nie zostanie zmienione przez przywołanie "DisableOptimizations = false"). –

+0

@BradChristie Uwielbiam pomysł przechowywania w sesji! – jessegavin

Odpowiedz

9

Rozszerzanie co wspomniałem w komentarzu:

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

wtedy oczywiście wykonawczego wygląda mniej więcej tak:

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

lub, jeśli wolisz podejście praktyczne:

+0

To jest naprawdę niesamowite. Dzięki za tonę. – jessegavin

+0

Prawie skończyłem pisać własną implementację na podstawie Twojego komentarza, ale bardziej lubię twoje! – jessegavin

+0

niesamowite - dziękuję, to jest wspaniałe –