如何在运行时临时禁用捆绑和缩小文件?
如何在运行时临时禁用捆绑和缩小文件?
为了调试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集群上运行)
- 有更好的处理方法吗?
问题的原因是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上找到。