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

11 浏览
0 Comments

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

为了调试JavaScript和CSS问题,我需要能够临时禁用捆绑和压缩。我希望通过在查询字符串中添加参数来在运行时实现这一点,如下所示:

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

以下是我考虑的方法。

protected void Application_BeginRequest(object sender, EventArgs e)
{
  // 每个请求都启用
  BundleTable.EnableOptimizations = true;
  // 对显式请求禁用
  bool disable;
  bool.TryParse(Context.Request.QueryString["DisableOptimizations"], out disable);
  if (disable)
  {
    BundleTable.EnableOptimizations = false;
  }
}

  • 设置这个静态属性对每个Web请求会有潜在的问题吗?(Web应用将在Web集群上运行)
  • 有更好的处理方法吗?
0
0 Comments

问题的原因是System.Web.Optimization.BundleTable.EnableOptimizations是一个全局属性,它的设置是持久的,对于所有后续的请求都保持不变。这会导致线程安全性问题,因为BundleTable.EnableOptimizations在幕后设置了一个静态字段。

解决方法是创建一个名为OptimizationsDebuggingAttribute的自定义属性,继承自ActionFilterAttribute。在OnActionExecuting方法中,首先检查是否有一个名为DisableOptimizations的查询字符串参数。如果有,解析该参数并将其赋值给optimizationsDisabled变量。如果没有,则检查名为MySite.DisableOptimizations的cookie是否存在,并解析该cookie的值。最后,根据optimizationsDisabled的值,将System.Web.Optimization.BundleTable.EnableOptimizations设置为相应的值,并将该值存储在cookie中,以便将来的请求可以使用。

为了实现这个功能,需要将OptimizationsDebuggingAttribute添加到全局过滤器集合中。可以通过在RegisterGlobalFilters方法中添加OptimizationsDebuggingAttribute实例来实现,也可以通过在具体的Action方法上添加[OptimizationsDebugging]特性来实现。

然而,由于BundleTable.EnableOptimizations的线程安全性问题,可以使用一个线程安全的替代方法,可以在stackoverflow上找到。

0