Udostępnij za pośrednictwem


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.

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

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

Dotyczy interfejsów API