【问题标题】:My app quits serving static files after the Windows April UpdateWindows 4 月更新后,我的应用程序停止提供静态文件
【发布时间】:2018-11-08 15:12:17
【问题描述】:

我有一个应用程序,其中 Content 文件夹由另一个构建前端应用程序的进程填充,而 Visual Studio 项目本身不知道文件夹中的内容。我用标准的<staticContent> 节点和<modules runAllManagedModulesForAllRequests="true"> 设置了web.config。我的 RouteConfig 设置为 routes.IgnoreRoute("content/*");

该应用程序通常使用 IIS Express 运行,但我也使用 IIS 正确运行它。

直接从内容文件夹加载 js、css 和其他静态文件都可以正常工作。也就是说,直到我安装了 Windows 四月更新。现在每个静态文件请求都会导致 404。如果我尝试转到请求的物理路径(但要通过 Exporer),我会得到文件。文件在那里。当我部署该应用程序时,它可以在 Azure 上运行,因此它必须是本地的。

这是我尝试过的:

  • 卸载 IIS Manager 和 IIS Express,从 c:\inetpub\temp\appPools 中删除 appPools 并重新安装 IIS Express。
  • 删除 staticContent 节点并将 runAllManagedModulesForAllRequests 设置为 false。
  • 授予对项目文件夹和子文件夹中“所有人”的完全访问权限。
  • 关闭 UAC。

可能是什么?我不知道如何在 Windows 更新后继续工作。

【问题讨论】:

    标签: c# .net asp.net-mvc iis-express static-files


    【解决方案1】:

    更新过程似乎以某种方式破坏了我的 IIS 安装。我执行了 Windows 刷新,安装了所有工具并下载了我的应用程序,它运行良好。

    很难快速或简单地修复,但几个小时后我又开始运行了。

    我发现了实际问题以及如何解决它。

    Windows 四月更新添加了一个漂亮的功能,您可以在其中为特定文件夹设置区分大小写。他们还让使用 Linux 子系统创建的任何文件夹都默认启用区分大小写。对 cmd.exe 或 powershell.exe 执行相同操作默认情况下会关闭区分大小写。

    我的应用程序有使用 node/webpack 构建的客户端部分,并放入 .Net 应用程序的 Content 文件夹中。当我进行 Windows 刷新时,我最初使用 cmd.exe 构建了我的应用程序,它运行良好。在我打开 Linux 子系统并使用 bash 构建应用程序后,我再次开始在 Content 文件夹中的所有文件上获得 404。 ProcMon.exe 告诉我失败的文件是大写的(即,如果文件是modernizr.min.js,IIS 正试图打开MODERNIZR.MIN.JS)。我不知道为什么 IIS 试图以全部大写字母加载文件,除了当 IIS 缓存文件时,它使用全部大写字母。

    一些解决方案

    选项 #1:不要使用 Linux 子系统或区分大小写的文件夹。

    这个问题似乎只发生在 IIS 从启用了区分大小写的文件夹中提供文件时,默认情况下会发生在 Linux 子系统中创建的文件夹。

    选项 #2:将 Linux 子系统的 Windows 默认设置为不区分大小写。

    编辑 /etc/wsl.conf(如果不存在则创建)并添加以下内容:

    [automount]
    options="case=off"
    

    您需要退出终端并重新启动它才能进行更改。之前在 bash 中创建的任何文件夹都需要设置它们的标志,或者被删除并重新创建。

    选项 #3:更新每个文件夹的区分大小写标志。

    这可以作为构建脚本的一部分添加,如果您不需要重复执行,也可以手动完成。您需要先设置执行策略才能运行 powershell 脚本。

    Set-ExecutionPolicy remoteSigned
    

    Powershell 脚本 (FixFolders.ps1):

    param (
        [string]$root = $( Get-Location )
    )
    
    if ( Test-Path $root ) {
    
        $rootPath = $( Get-Item -Path $root )
    
        fsutil file setCaseSensitiveInfo $rootPath disable
        foreach ($path in Get-ChildItem -Path $rootPath -Directory -Recurse) {
            fsutil file setCaseSensitiveInfo $path.FullName disable
        }
    }
    

    此脚本将禁用指定文件夹(或当前文件夹)和所有子文件夹的区分大小写。

    FixFolders.ps1 将在当前文件夹和所有子文件夹上运行。

    FixFolders.ps1 c:\dev 将在 c:\dev 和所有子文件夹上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 2016-10-26
      • 2020-02-12
      • 2016-12-23
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多