if (noCache) {
cachePolicy.SetCacheability(HttpCacheability.NoCache);
}
noCache变量是通过参数设置的,本例中调用方法是设置它:
// Set to no-cache if the version requested does not match
bool noCache = false;
var request = context.HttpContext.Request;
if (request != null) {
string queryVersion = request.QueryString.Get(VersionQueryString);
if (queryVersion != null && bundleResponse.GetContentHashCode() != queryVersion) {
noCache = true;
}
}
3条答案
按热度按时间rn0zuynd1#
我看到的行为与提到该问题的codeplex链接中描述的行为相同:
即如果我按以下顺序访问这些URL,则行为是-
我决定深入研究一下System.Web.Optimization源代码,看看到底发生了什么。在Bundle类上,有一个私有方法设置头,它似乎落入了以下代码中:
noCache变量是通过参数设置的,本例中调用方法是设置它:
长话短说,我们已经切换到使用Azure CDN为我们的捆绑包,并根据程序集版本将版本查询字符串参数更改为类似于?v= www.example.com的内容1.0.0.0(类似于this question)。捆绑包代码将“1.0.0.0”与捆绑包内容的SHA 256哈希代码进行比较,并将捆绑包标记为无缓存。
我通过更新查询字符串以匹配内容哈希来解决这个问题。
不幸的是,GetContentHashCode方法的访问级别被标记为internal,因此有必要复制implementation。我最终创建了一个继承自Bundle的类,以便它可以将版本号作为转换应用于CdnPath:
sgtfey8w2#
问题似乎出在Microsoft.AspNet.Web.Optimization NuGet包上。将版本从1. 3. 0降级到1. 1. 0后,一切似乎都运行正常。
Link to blog post on codeplex which mentioned the same issue
monwx1rj3#
由于上面的答案对我没有帮助(不确定后果),我找到了这个问题的变通方案。
问题是,正如这里已经提到的,当您在查询字符串上发送
?v
时,如果该值与实际的散列不匹配,它将返回no-cache
。根本不发送任何内容不是一个选项(缓存可能永远不会过期)。发送缓存破坏参数也不是一个选项。如果您这样做并且您有多个示例,则可能会在部署期间缓存错误的值(如果您不从负载平衡器中删除旧示例)。
要解决此问题,只需将
UseCdn
设置为false
,并在捆绑包配置期间更改以下内容:霍普我帮过忙。