Как временно отключить связывание и минификацию во время выполнения?

Мне нужно иметь возможность временно отключить объединение и минимизацию для одного запроса с целью отладки проблем с JavaScript и CSS. Я хотел бы сделать это во время выполнения, добавив параметр в QueryString следующим образом.

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

Вот подход, который я рассматриваю.

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;
  }
}
  • Существуют ли какие-либо потенциальные проблемы с тем фактом, что я устанавливаю это статическое свойство для каждого веб-запроса? (Веб-приложение будет работать на веб-ферме)
  • Есть ли лучшие способы справиться с этим?

person jessegavin    schedule 10.01.2013    source источник
comment
Я не вижу никакой ошибки, хотя я бы порекомендовал использовать ActionFilter и, возможно, сохранить кешированное включение/выключение в переменной cookie/сеанса (до тех пор, пока не будет изменено путем вызова DisableOptimizations=false).   -  person Brad Christie    schedule 11.01.2013
comment
@BradChristie Мне нравится идея хранить его в сеансе!   -  person jessegavin    schedule 11.01.2013


Ответы (1)


Расширение того, что я упомянул в комментарии:

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

тогда, конечно, реализация выглядит примерно так:

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

Или, если вы предпочитаете практический подход:

[OptimizationsDebugging]
public ActionResult TroublesomeAction()
{
    return View();
}
person Brad Christie    schedule 10.01.2013
comment
Это серьезно круто. Благодаря тонну. - person jessegavin; 11.01.2013
comment
Я почти закончил писать свою реализацию на основе вашего комментария, но ваш мне нравится больше! - person jessegavin; 11.01.2013
comment
Похоже, что System.Web.Optimization.BundleTable.EnableOptimizations — это постоянное глобальное свойство, а не для каждого запроса. Когда для него установлено значение true/false, оно остается в этом значении true/false для всех последующих запросов к приложению от кого-либо. - person Ben Amada; 25.08.2013
comment
Это не потокобезопасно! Если это действительно работает, вы можете повлиять на другие запросы, потому что BundleTable.EnableOptimizations устанавливает статическое поле под капотом. - person Brandon Cuff; 14.03.2014
comment
Поточно-безопасную альтернативу можно найти здесь: stackoverflow.com/a/24444226/1232258 - person extremeandy; 22.11.2016