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

Posted

技术标签:

【中文标题】如何防止 IIS 7.5 缓存符号链接内容?【英文标题】:How do I prevent IIS 7.5 from caching symlink content? 【发布时间】:2011-07-14 18:55:39 【问题描述】:

我已将 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>

有几个人提到这个问题:

http://forums.iis.net/t/1166077.aspx http://forums.iis.net/t/1171204.aspx

任何提示如何解决这个问题?

【问题讨论】:

回收应用程序池应该更新这些文件——然而,它本身并不是一个解决方案。 (是的,回收应用程序池会丢弃缓存。) 【参考方案1】:

大约一个月前,这个问题让我发疯了。您必须在注册表中禁用 IIS 缓存,据我所知,这在 IIS 7 的任何地方都没有记录,而是一个仍然有效的旧 IIS 5 技巧。您可以将以下内容转换为 .reg 文件并将其导入,也可以导航到该部分并手动添加。我建议在更改此参数后重新启动,我不确定 IIS 是否会在 iisreset 后将其拾取。

Windows Registry Editor Version 5.00

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

【讨论】:

是否可以按网站设置? 不幸的是,没有。注册表值关闭全局缓存。 +1 好的,谢谢提示。但我不能使用它——因为我只需要一个站点:( 有人在 IIS8.5 上试过这个吗?我遇到了任何非静态文件(web.config、.aspx 等)的缓存问题,为了让更改出现,我必须重新启动完整的应用程序池。 这解决了我在 IIS7 上的问题。我已经迁移到带有 IIS 10 的 Windows 10,应用了修复程序,但我又在静态资源上获得了一个过时的缓存:(【参考方案2】:

我之前可以在 IIS7 上使用 Banin's fix 解决此问题。从那以后,我已经使用 IIS 10 迁移到 Windows 10,并且再次遇到了同样的问题。 DisableMemoryCache 没有帮助。

然后我禁用了内核缓存,现在,这似乎解决了问题(我很抱歉屏幕截图中的荷兰语):

【讨论】:

请注意,OP 已禁用内核缓存 (enableKernelCache="false")。不幸的是,这个解决方案在 IIS 10 上对我不起作用。结果相同。【参考方案3】:

巴宁的解决方案对我有用。更改注册表参数并重置 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!!!");
    
  

【讨论】:

以上是关于如何防止 IIS 7.5 缓存符号链接内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止特定符号被编译器/链接器剥离?

如何防止静态库中的所有符号加载以及为什么在链接静态库时导出相同.o文件中的其他符号进行测试

在asp中加入了防止sql注入代码 如何输入符号

目录是不是由 Hadoop 缓存符号链接处理?

如何比较两个 tar 档案(包括文件内容、新/删除的文件、符号链接)?

链接共享库时限制符号的可见性