Windows 四月更新后,我的应用停止提供静态文件

My app quits serving static files after the Windows April Update

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

该应用程序通常 运行 带有 IIS Express,但我也 运行 它带有 IIS。

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

这是我尝试过的方法:

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

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

几乎没有快速或简单的修复方法,但我在几个小时后再次 运行ning。

我找到了实际问题以及解决方法。

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

我的应用程序的客户端部分使用 node/webpack 构建并放入 .Net 应用程序的内容文件夹中。当我执行 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 和所有子文件夹上 运行。