如何防止 IIS 7.5 缓存符号链接内容?

19
我已经设置了IIS 7.5来静态服务一些文件,其中一些文件实际上是符号链接(由mklink创建)。
即使我禁用了内核缓存和用户缓存,这些文件似乎仍然被IIS缓存。在文件被修改后,IIS仍然提供旧版本的文件。
为确保这不是由ASP.NET引起的问题,我创建了一个专用的非托管AppPool。我还检查了这些文件没有被浏览器缓存。
我的web.config如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
        <caching enabled="false" enableKernelCache="false" />
        <urlCompression doStaticCompression="false" doDynamicCompression="false" />
        <staticContent>
            <clientCache cacheControlMode="DisableCache" />
        </staticContent>
    </system.webServer>
</configuration>

有几个人提到了这个问题:

有什么提示可以解决这个问题吗?


2
回收应用程序池应该更新这些文件-但并不是一个解决方案。 - Factor Mystic
是的,回收应用程序池会丢弃缓存。 - TN.
3个回答

23

这个问题之前曾经把我困扰了一个月。据我所知,你需要在注册表中禁用IIS缓存,尽管对于IIS 7没有任何文档记录,但这是一个旧的IIS 5技巧,仍然有效。您可以将下面的内容转换为.reg文件并导入,或者手动导航到该部分并添加它。更改此参数后建议重新启动计算机,我不确定仅通过iisreset IIS是否会立即生效。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters]
"DisableMemoryCache"=dword:1

很遗憾,不行。注册表值会全局关闭缓存。 - Banin
2
有人在IIS8.5上尝试过这个吗?我特别遇到了任何非静态文件(web.config,.aspx等)的缓存问题。为了使更改生效,我必须进行完整的应用程序池重启。 - hereswhatidid
2
这解决了我在IIS7上的问题。我已经迁移到带有IIS 10的Windows 10,应用了修复程序,但是静态资源仍然存在过期缓存:( - Grimace of Despair
@ GrimaceofDespair 你最终解决了这个问题吗? - IluTov
@hereswhatidid 我们最终解决了这个问题吗? - IluTov
显示剩余5条评论

3

我之前曾经使用 Banin的解决方法在IIS7上修复过这个问题。 从那时起,我迁移到了带有IIS 10的Windows 10,并再次遇到了同样的问题。在这种情况下,DisableMemoryCache无效。

然后我禁用了内核缓存,目前看来,这似乎解决了该问题(对于截图中的荷兰语我感到抱歉):

IIS对话框屏幕截图


请注意,OP已经禁用了内核缓存(enableKernelCache="false")。不幸的是,在IIS 10上这个解决方案对我无效。 - IluTov

1
Banin的解决方案对我有效。在更改注册表参数并重置IIS后,问题得到了解决。下面的C#程序(您可以使用LINQPad运行它)将帮助您复现此问题:
using System.IO;
using System.Net;

void Main()
 {
  var virtualPath = "JunctionPoint/sample.js";
  var physicalPath = $@"C:\IISROOT\JunctionPoint\{virtualPath}";

  for (int i = 0; i < 100; i++) {   
    File.WriteAllText(physicalPath, i.ToString());

    Console.Write(i + "=");

    var client = new WebClient();
    string html = client.DownloadString($"http://localhost/{virtualPath}");
    Console.WriteLine(html);

    if (i.ToString() != html) {
      Console.WriteLine("Issue reproduced!!!");
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接