Como um aplicativo de API da Web .Net Core 3.0 de arquivo único deve ser configurado para procurar o appsettings.json
arquivo que está no mesmo diretório em que o aplicativo de arquivo único é criado?
Depois de correr
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
O diretório fica assim:
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
No entanto, tentar executar APPNAME.exe
resultados no seguinte erro
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()
...
Tentei soluções a partir de uma pergunta semelhante, mas distinta , bem como de outras questões do Stack Overflow.
Tentei passar o seguinte para SetBasePath()
Directory.GetCurrentDirectory()
environment.ContentRootPath
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Cada um deles levou ao mesmo erro.
A raiz do problema é que o PublishSingleFile
binário é descompactado e executado a partir de um temp
diretório.
No caso deste aplicativo de arquivo único, o local que ele estava procurando appsettings.json
era o seguinte diretório:
C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs
Todos os métodos acima apontam para o local em que o arquivo está descompactado, diferente do local em que foi executado.