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é.
la source
Si vous êtes d'accord avec l'utilisation de fichiers à l'exécution en dehors de l'exécutable, vous pouvez simplement signaler les fichiers que vous souhaitez à l'extérieur, dans csproj. Cette méthode permet des changements en direct et autres dans un emplacement connu.
Si cela n'est pas acceptable et ne doit avoir qu'un seul fichier, je passe le chemin extrait d'un seul fichier comme chemin racine dans ma configuration d'hôte. Cela permet à la configuration et au rasoir (que j'ajoute après) de retrouver ses fichiers normalement.
Remarque, pour vraiment créer un seul fichier, et pas de PDB, vous aurez également besoin de:
la source
Mon application est sur .NET Core 3.1, est publiée en tant que fichier unique et s'exécute en tant que service Windows (ce qui peut ou non avoir un impact sur le problème).
La solution proposée avec
Process.GetCurrentProcess().MainModule.FileName
comme racine de contenu fonctionne pour moi, mais seulement si je mets la racine de contenu au bon endroit:Cela marche:
Cela ne fonctionne pas:
la source