¿Cómo se debe configurar una aplicación de API web .Net Core 3.0 de un solo archivo para buscar el appsettings.json
archivo que está en el mismo directorio en el que está construida la aplicación de un solo archivo?
despues de correr
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
El directorio se ve así:
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
Sin embargo, al intentar ejecutar los APPNAME.exe
resultados en el siguiente error
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()
...
Probé soluciones de una pregunta similar pero distinta , así como otras preguntas de Stack Overflow.
Intenté pasar lo siguiente a SetBasePath()
Directory.GetCurrentDirectory()
environment.ContentRootPath
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Cada uno condujo al mismo error.
La raíz del problema es que el PublishSingleFile
binario se descomprime y se ejecuta desde un temp
directorio.
En el caso de esta aplicación de archivo único, la ubicación que buscaba appsettings.json
era el siguiente directorio:
C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs
Todos los métodos anteriores apuntan al lugar donde se descomprime el archivo, que es diferente del lugar desde el que se ejecutó.