Мое приложение перестает обслуживать статические файлы после апрельского обновления Windows - PullRequest
0 голосов
/ 30 мая 2018

У меня есть приложение, в котором папка Content заполняется другим процессом, который создает приложение внешнего интерфейса, а сам проект Visual Studio не знает, что находится в этой папке.Я настроил web.config со стандартным узлом <staticContent> и <modules runAllManagedModulesForAllRequests="true">.Мой RouteConfig настроен с routes.IgnoreRoute("content/*");

Приложение обычно работает с IIS Express, но я также запускаю его с соответствующим IIS.

Это все нормально работало для загрузки js, cssи другие статические файлы прямо из папки содержимого.То есть до тех пор, пока я не установил апрельское обновление Windows.Теперь каждый запрос статического файла приводит к 404. Если я пытаюсь перейти по запрошенному физическому пути (но через Exporer), я получаю файл.Файлы есть.Приложение работает в Azure при его развертывании, поэтому оно должно быть локальным.

Вот что я пробовал:

  • Удаление IIS Manager и IIS Express, удаление appPoolsиз c:\inetpub\temp\appPools и переустановки IIS Express.
  • Удаление узла staticContent и установка для runAllManagedModulesForAllRequests значения false.
  • Предоставление полного доступа всем пользователям в папке проекта и подпапках.
  • Выключение UAC.

Что бы это могло быть?Я не знаю, как продолжить работу после Центра обновления Windows.

1 Ответ

0 голосов
/ 05 июня 2018

Похоже, что процесс обновления каким-то образом повредил мою установку IIS.Я выполнил обновление Windows, установил все свои инструменты и закрыл свое приложение, и оно прекрасно работает.

Едва быстрое или простое исправление, но я снова заработал через несколько часов.

Я обнаружил реальную проблему и способы ее устранения.

Апрельское обновление Windows добавило изящную функцию, позволяющую включать или отключать чувствительность к регистру для определенных папок.Они также сделали так, чтобы в любой папке, созданной с помощью подсистемы Linux, чувствительность к регистру была включена по умолчанию.При выполнении команды cmd.exe или powershell.exe по умолчанию отключена чувствительность к регистру.

В моем приложении клиентская часть построена с использованием node / webpack и помещена в папку Content приложения .Net.Когда я выполнял обновление Windows, я изначально создавал приложение с помощью cmd.exe, и оно работало нормально.После того, как я включил подсистему Linux и собрал приложение с помощью bash, я снова начал получать 404s для всех файлов в папке Content.ProcMon.exe говорил мне, что файлы, которые не работали, были в верхнем регистре (то есть, если файл - modernizr.min.js, IIS пытался открыть MODERNIZR.MIN.JS).Я не уверен, почему IIS пытался загрузить файл всеми заглавными буквами, кроме того факта, что, когда IIS кэширует файл, он использует все заглавные буквы.

НЕКОТОРЫЕ РЕШЕНИЯ

Вариант # 1: Не используйте подсистему Linux или папки, чувствительные к регистру.

Эта проблема, по-видимому, возникает, только когда IIS обслуживает файлы из папки с включенной чувствительностью к регистру, что происходит по умолчанию с папками, созданными в подсистеме Linux.

Вариант № 2: Установите для Windows по умолчанию для подсистемы Linux использование нечувствительности к регистру.

Отредактируйте /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 и всехвложенные папки.

...