Sni*_*tor 5 asp.net caching url-rewriting iis-7.5
我有一个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");
}
}
Run Code Online (Sandbox Code Playgroud)
路径"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中的URL替换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".
你可以做如下的事情。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1182 次 |
| 最近记录: |