Comment une application d'API Web .Net Core 3.0 à fichier unique doit-elle être configurée pour rechercher le appsettings.json
fichier se trouvant dans le même répertoire que l'application à fichier unique?
Après avoir couru
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Le répertoire ressemble à ceci:
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
Cependant, la tentative d'exécution APPNAME.exe
entraîne l'erreur suivante
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()
...
J'ai essayé des solutions à partir d'une question similaire, mais distincte , ainsi que d'autres questions Stack Overflow.
J'ai tenté de transmettre ce qui suit à SetBasePath()
Directory.GetCurrentDirectory()
environment.ContentRootPath
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Chacun a conduit à la même erreur.
La racine du problème est que le PublishSingleFile
binaire est décompressé et exécuté à partir d'un temp
répertoire.
Dans le cas de cette application à fichier unique, l'emplacement qu'elle recherchait appsettings.json
était le répertoire suivant:
C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs
Toutes les méthodes ci-dessus pointent vers l'endroit où le fichier est décompressé, ce qui est différent de l'endroit à partir duquel il a été exécuté.