ASP.NET HttpModule重写路径虚拟目录缓存未刷新
我有一个ASP.NET IHttpModule实现,用于重写服务文件的路径。该模块仅处理一个事件,ASP.NET HttpModule重写路径虚拟目录缓存未刷新,asp.net,caching,url-rewriting,iis-7.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
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/virtdir/image.png
,问题似乎没有出现。但奇怪的是,在使用“foobar”URL出现问题后,直接URL也开始返回图像的过期副本
相关细节:
http://myserver/iismodulecachetest/foobar.png
上下文\u PostAuthenticateRequest
事件处理程序,并且无论缓存是否被卡住,其行为都是相同的还请注意,目录显然受到监视,根据
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);
}
}
使用方法
RewritePath
来处理虚拟目录中的静态资源时,我也遇到了同样的问题。
我没有使用此方法的解决方案,但最后我选择使用方法Server.TransferRequest
,这表明没有缓存问题
HttpContext.Current.Server.TransferRequest(newUrl);
请求传输将由
IHttpModule
再次处理,因此您需要小心不要产生循环。能否确认文件上的修改日期确实发生了更改?是的,刚刚测试过。Windows资源管理器清楚地显示了文件的新修改日期,但IIS仍返回旧版本。Http标头“上次修改"也将返回旧的修改日期。我将与Microsoft一起打开一个支持票证。这显然是一个bug,所以它应该是100%免费的。MS支持票证。-叹气-每次我提出其中一个,我都会有一头白发。我也不是开玩笑。我8年前第一次头发变白,是为了处理虚拟路径提供程序impleme中的ASP.NET内存泄漏Intation…在那场惨败中了解了整个ASP.NET团队。不过,他们很快就修补了。原则上,我认为这会破坏缓存,从而绕过这个问题,尽管在实践中,Random
的实例需要作为一个单例来处理,以避免重复值。