【问题标题】:How to temporarily disable bundling and minification at runtime?如何在运行时暂时禁用捆绑和缩小?
【发布时间】:2012-12-25 07:20:18
【问题描述】:

为了调试 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;
  }
}
  • 在每个 Web 请求上都设置此静态属性这一事实是否存在任何潜在问题? (网络应用将在网络场上运行)
  • 有没有更好的方法来处理这个问题?

【问题讨论】:

  • 我没有看到任何错误,但我建议使用 ActionFilter 并可能将缓存的开/关存储在 cookie/会话变量中(直到通过调用 DisableOptimizations=false 进行更改)。跨度>
  • @BradChristie 我喜欢将它存储在会话中的想法!

标签: c# asp.net asp.net-mvc asp.net-optimization bundling-and-minification


【解决方案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();
}

【讨论】:

  • 这真是太棒了。非常感谢。
  • 根据您的评论,我几乎完成了自己的实现,但我更喜欢您的!
  • 看来 System.Web.Optimization.BundleTable.EnableOptimizations 是一个持久的全局属性,而不是每个请求。当它设置为真/假时,对于任何人对应用程序的所有后续请求,它都保持在该真/假值。
  • 这不是线程安全的!如果它确实有效,您最终可能会影响其他请求,因为 BundleTable.EnableOptimizations 在后台设置了一个静态字段。
  • 可以在这里找到线程安全的替代方案:stackoverflow.com/a/24444226/1232258
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2017-12-13
  • 2014-11-26
  • 2013-06-27
  • 2012-06-28
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多