ContentRootPath dla aplikacji uruchomionych przez powłokę systemu Windows
Właściwość IHostEnvironment.ContentRootPath reprezentuje katalog domyślny, w którym appsettings.json i inne pliki zawartości są ładowane w hostowanej aplikacji, w tym w aplikacjach ASP.NET. Wartość tej właściwości jest domyślnie ustawiona na Environment.CurrentDirectorywartość , która jest bieżącym katalogem roboczym aplikacji. To zachowanie umożliwia wykonywanie tej samej aplikacji w różnych katalogach roboczych i używanie zawartości z każdego katalogu.
Po uruchomieniu procesu systemu Windows (aplikacji lub usługi) bez określania katalogu roboczego używany jest katalog roboczy procesu, który go utworzył. Katalog roboczy powłoki systemu Windows lub services.exe to %windir%\system32 (lub System
folder specjalny). Gdy którykolwiek z tych procesów uruchamia hostowaną aplikację, ContentRootPath
właściwość jest ustawiona na %windir%\system32.
To zachowanie jest mylące i powoduje niepowodzenie hostowanych aplikacji, ponieważ aplikacja próbuje załadować pliki z katalogu %windir%\system32 , ale nie istnieje. Na przykład plik appsettings.json nie zostanie znaleziony w czasie wykonywania, a ustawienia nie są stosowane.
Począwszy od platformy .NET 7, gdy hostowana aplikacja jest uruchamiana z bieżącym katalogiem ustawionym System
na folder specjalny, domyślnie właściwość ma ContentRootPath
wartość AppContext.BaseDirectory.
Wprowadzona wersja
.NET 7
Poprzednie zachowanie
Host.CreateDefaultBuilder domyślnie właściwość ma ContentRootPath wartość Environment.CurrentDirectory niezależnie od wartości bieżącego katalogu.
Nowe zachowanie
Host.CreateDefaultBuilder Właściwość nie jest już domyślna ContentRootPath dla bieżącego katalogu, jeśli jest System
to folder specjalny w systemie Windows. Zamiast tego jest używany katalog podstawowy aplikacji.
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Deweloperzy aplikacji nie spodziewali ContentRootPath się, że będzie C:\Windows\system32 , gdy aplikacja została uruchomiona przez system Windows w niektórych przypadkach (na przykład gdy aplikacja została spakowana jako MSIX lub uruchomiona z menu Start). W takich przypadkach lepiej jest domyślnie ustawić ContentRootPath właściwość w katalogu podstawowym aplikacji.
Zalecana akcja
Jeśli chcesz użyć poprzedniego zachowania, możesz jawnie ustawić ContentRootPath
właściwość podczas tworzenia elementu IHostBuilder:
Host
.CreateDefaultBuilder()
.UseContentRoot(Environment.CurrentDirectory)
....