Udostępnij przez


Ścieżka ContentRootPath dla aplikacji uruchomionych przez Windows Shell

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.CurrentDirectory, który jest bieżącym katalogiem 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 jest %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 został znaleziony w czasie wykonywania i ustawienia nie są stosowane.

Począwszy od platformy .NET 7, gdy hostowana aplikacja jest uruchamiana z ustawionym bieżącym katalogiem jako System folder specjalny, właściwość ContentRootPath jest domyślnie ustawiana na AppContext.BaseDirectory.

Wersja wprowadzona

.NET 7

Poprzednie zachowanie

Host.CreateDefaultBuilder ustawiono właściwość ContentRootPath na domyślną wartość Environment.CurrentDirectory, niezależnie od wartości bieżącego katalogu.

Nowe zachowanie

Host.CreateDefaultBuilder Właściwość ContentRootPath nie jest już automatycznie ustawiana na bieżący katalog, jeśli System to folder specjalny w systemie Windows. Zamiast tego jest używany katalog podstawowy aplikacji.

Typ zmiany przełamującej

Ta zmiana może mieć wpływ na zgodność binarną.

Przyczyna zmiany

Deweloperzy aplikacji nie spodziewali się, że ścieżka ContentRootPath będzie aktywna, kiedy aplikacja była uruchamiana przez system Windows w określonych przypadkach (na przykład, gdy aplikacja była spakowana jako MSIX lub uruchamiana z menu Start). W takich przypadkach lepiej jest domyślnie ustawić ContentRootPath właściwość w katalogu podstawowym aplikacji.

Jeśli chcesz użyć poprzedniego zachowania, możesz jawnie ustawić ContentRootPath właściwość podczas tworzenia elementu IHostBuilder:

Host
    .CreateDefaultBuilder()
    .UseContentRoot(Environment.CurrentDirectory)
    ....

Interfejsy API, których dotyczy problem