如何在运行时暂时禁用捆绑和缩小文件?

20

我需要临时禁用捆绑和压缩,以便于调试 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请求上设置这个静态属性是否存在潜在问题?(Web应用程序将在Web农场上运行)
  • 有更好的处理方法吗?

2
我没有看到任何错误,但我建议使用ActionFilter,并可能将缓存的开/关存储在cookie/session变量中(直到通过重新调用“DisableOptimizations=false”更改)。 - Brad Christie
@BradChristie 我喜欢将其存储在会话中的想法! - jessegavin
1个回答

9

在我之前的评论中提到过的扩展:

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

这真是太棒了。非常感谢。 - jessegavin
我差不多写完了基于你的评论的自己的实现,但是我更喜欢你的! - jessegavin
6
System.Web.Optimization.BundleTable.EnableOptimizations 是一个全局性质的属性,它是持久性的,而不是每个请求都有自己的属性。当将其设置为 true/false 时,对于从任何人发起的应用程序的所有后续请求,它将保持在该 true/false 值上。 - Ben Amada
8
这不是线程安全的!如果实际上它确实工作,你可能会影响到其他请求,因为BundleTable.EnableOptimizations在幕后设置一个静态字段。 - Brandon Cuff
这里可以找到一个线程安全的替代方案:https://dev59.com/EWct5IYBdhLWcg3wn-1z#24444226 - extremeandy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接