¿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ó.
fuente
Si está de acuerdo con que los archivos se usen en tiempo de ejecución fuera del ejecutable, entonces puede marcar los archivos que desea fuera, en csproj. Este método permite cambios en vivo y tal en una ubicación conocida.
Si esto no es aceptable, y debe tener SOLO un solo archivo, paso la ruta extraída de un solo archivo como la ruta raíz en la configuración de mi host. Esto permite la configuración y la maquinilla de afeitar (que agrego después) para encontrar sus archivos de manera normal.
Tenga en cuenta que para crear realmente un solo archivo y sin PDB, también necesitará:
fuente
Mi aplicación está en .NET Core 3.1, se publica como un solo archivo y se ejecuta como un Servicio de Windows (que puede o no tener un impacto en el problema).
La solución propuesta con
Process.GetCurrentProcess().MainModule.FileName
la raíz de contenido funciona para mí, pero solo si configuro la raíz de contenido en el lugar correcto:Esto funciona:
Esto no funciona:
fuente