C# 如何在运行时临时禁用绑定和缩小?

C# 如何在运行时临时禁用绑定和缩小?,c#,asp.net,asp.net-mvc,asp.net-optimization,bundling-and-minification,C#,Asp.net,Asp.net Mvc,Asp.net Optimization,Bundling And Minification,为了调试JavaScript和CSS问题,我需要能够暂时禁用单个请求的绑定和缩小。我希望在运行时通过向QueryString添加一个参数来实现这一点,如下所示 http://domain.com/page?DisableOptimizations=true 以下是我正在考虑的方法 protected void Application_BeginRequest(object sender, EventArgs e) { // Enable for every request Bundle

为了调试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场上运行)
  • 有没有更好的方法来处理这个问题

    • 扩展我在评论中提到的内容:

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

      虽然我建议使用ActionFilter,并可能将缓存的开/关存储在cookie/会话变量中(直到通过调用
      DisableOptimizations=false
      进行更改),但我没有发现任何错误。@bradcristie我喜欢将其存储在会话中的想法!这真是太棒了。非常感谢。根据你的评论,我几乎完成了自己的实现,但我更喜欢你的!似乎System.Web.Optimization.BundleTable.EnableOptimizations是一个持久的全局属性,而不是每个请求。当它设置为true/false时,任何人对应用程序的所有后续请求都将保持该true/false值。这不是线程安全的!如果它确实起作用,那么最终可能会影响其他请求,因为BundleTable.EnableOptimizations会在引擎盖下设置一个静态字段。可以在此处找到线程安全的替代方法: