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 上运行,因此它必须是本地的。
这是我尝试过的方法:
- 卸载 IIS 管理器和 IIS Express,从
c:\inetpub\temp\appPools
中删除 appPools 并重新安装 IIS Express。
- 删除 staticContent 节点并将 运行AllManagedModulesForAllRequests 设置为 false。
- 授予对项目文件夹和子文件夹中 "Everybody" 的完全访问权限。
- 正在关闭 UAC。
会是什么?我不知道如何在 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 和所有子文件夹上 运行。
我有一个应用程序,其中 Content 文件夹由另一个构建前端应用程序的进程填充,并且 Visual Studio 项目本身不知道文件夹中有什么。我使用标准 <staticContent>
节点和 <modules runAllManagedModulesForAllRequests="true">
设置了 web.config。我的 RouteConfig 设置为 routes.IgnoreRoute("content/*");
该应用程序通常 运行 带有 IIS Express,但我也 运行 它带有 IIS。
直接从 content 文件夹加载 js、css 和其他静态文件时一切正常。也就是说,直到我安装了 Windows 四月更新。现在每个静态文件请求都会导致 404。如果我尝试转到请求的物理路径(但通过 Exporer),我会得到该文件。文件在那里。该应用程序在我部署时在 Azure 上运行,因此它必须是本地的。
这是我尝试过的方法:
- 卸载 IIS 管理器和 IIS Express,从
c:\inetpub\temp\appPools
中删除 appPools 并重新安装 IIS Express。 - 删除 staticContent 节点并将 运行AllManagedModulesForAllRequests 设置为 false。
- 授予对项目文件夹和子文件夹中 "Everybody" 的完全访问权限。
- 正在关闭 UAC。
会是什么?我不知道如何在 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 和所有子文件夹上 运行。