Jak należy skonfigurować aplikację interfejsu API sieci Web z jednym plikiem .Net Core 3.0 w celu wyszukiwania appsettings.json
pliku znajdującego się w tym samym katalogu, w którym zbudowana jest aplikacja z jednym plikiem?
Po bieganiu
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Katalog wygląda następująco:
XX/XX/XXXX XX:XX PM <DIR> .
XX/XX/XXXX XX:XX PM <DIR> ..
XX/XX/XXXX XX:XX PM 134 appsettings.json
XX/XX/XXXX XX:XX PM 92,899,983 APPNAME.exe
XX/XX/XXXX XX:XX PM 541 web.config
3 File(s) 92,900,658 bytes
Jednak próba uruchomienia APPNAME.exe
powoduje następujący błąd
An exception occurred, System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs\appsettings.json'.
at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info)
at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
...
Próbowałem rozwiązań z podobnego, ale odrębnego pytania , a także innych pytań dotyczących przepełnienia stosu.
Próbowałem przekazać następujące informacje SetBasePath()
Directory.GetCurrentDirectory()
environment.ContentRootPath
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Każdy z nich doprowadził do tego samego błędu.
Głównym problemem jest to, że PublishSingleFile
plik binarny jest rozpakowywany i uruchamiany z temp
katalogu.
W przypadku tej aplikacji z pojedynczym plikiem lokalizacją, której szukała, appsettings.json
był następujący katalog:
C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs
Wszystkie powyższe metody wskazują miejsce, do którego rozpakowany jest plik, który jest inny niż miejsce, z którego został uruchomiony.
źródło
Jeśli nie masz nic przeciwko, aby pliki były używane w czasie wykonywania poza plikiem wykonywalnym, możesz po prostu oflagować pliki, które chcesz na zewnątrz, w csproj. Ta metoda pozwala na zmiany na żywo i takie w znanej lokalizacji.
Jeśli jest to niedopuszczalne i musi zawierać TYLKO jeden plik, przekazuję ścieżkę wyodrębnioną z jednego pliku jako ścieżkę katalogu głównego w konfiguracji hosta. Umożliwia to konfigurację i maszynkę do golenia (które dodam później), aby normalnie znajdować pliki.
Uwaga: aby naprawdę utworzyć pojedynczy plik i nie mieć PDB, potrzebujesz również:
źródło