我有一个ASP.NET IHttpModule实现,旨在重写服务文件的路径。该模块只处理一个事件PostAuthenticateRequest
,如下所示:
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Path.ToLower().Contains("foobar"))
{
HttpContext.Current.RewritePath("virtdir/image.png");
}
}
路径“virtdir”是应用程序的虚拟目录子级。应用程序本身在典型位置运行:C:\ inetpub \ wwwroot \ IisModuleCacheTest \虚拟目录“virtdir”映射到C:\ TestVirtDir \
对http://myserver/iismodulecachetest/foobar
的请求将按预期从虚拟目录返回image.png。同样,对http://myserver/iismodulecachetest/virtdir/image.png
的请求将返回相同的图像文件。
然后我执行以下操作:
http://myserver/iismodulecachetest/foobar
在间隔几秒钟的1到20次重复之后,返回的图像将是过时的副本。
一旦感到不安,服务器只会在经过一段未知时间后(从10秒到几分钟)返回当前版本。如果我将步骤1中的网址替换为http://myserver/iismodulecachetest/virtdir/image.png
,则问题似乎不会出现。但奇怪的是,在使用“foobar”URL出现问题后,直接URL 也开始返回图像的过时副本。
相关详细信息:
<caching enabled="false" enableKernelCache="false" />
修改 - 更多详情:
http://myserver/iismodulecachetest/foobar.png
。context_PostAuthenticateRequest
事件处理程序,并且无论缓存是否卡住,其行为方式都相同。Edit2 - IIS日志:
我在IIS中启用了“失败的请求跟踪”(有趣的是,如果配置正确,这对于非 - 失败的请求是如何工作的。管道是相同的,直到第17步请求返回过时版本清楚地显示了缓存命中。
第一个请求看起来很好,缓存未命中:
但是一旦卡住了,就会反复显示缓存命中:
缓存命中后的事件可以理解地与缓存未命中情况完全不同。它真的只是看起来IIS完全满足于认为它的文件缓存是最新的,当它绝对不是! :(
在堆栈的下方,我们看到第一个请求:
然后是(错误的)缓存命中请求:
另请注意,根据FileDirmoned="true"
,目录显然已被监控。
答案 0 :(得分:1)
您可以执行以下操作。
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Path.ToLower().Contains("foobar"))
{
Random rnd = new Random();
int randomNumber = rnd.Next(int.MinValue, int.MaxValue);
HttpContext.Current.RewritePath("virtdir/image.png?"+randomNumber);
}
}
答案 1 :(得分:0)
使用方法RewritePath
解决虚拟目录中的静态资源时遇到了同样的问题。
我没有使用此方法的解决方案,但最后我选择使用方法Server.TransferRequest
,这显示没有缓存问题。
HttpContext.Current.Server.TransferRequest(newUrl);
请求传输由IHttpModule
再次处理,因此您需要小心不要产生循环。