Bagaimana seharusnya aplikasi file tunggal .Net Core 3.0 Web API dikonfigurasikan untuk mencari appsettings.json
file yang ada di direktori yang sama dengan aplikasi file tunggal dibangun?
Setelah berlari
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Direktori terlihat seperti ini:
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
Namun, berusaha menjalankan APPNAME.exe
hasil dalam kesalahan berikut
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()
...
Saya mencoba solusi dari pertanyaan yang serupa tetapi berbeda , serta pertanyaan Stack Overflow lainnya.
Saya mencoba meneruskan yang berikut ke SetBasePath()
Directory.GetCurrentDirectory()
environment.ContentRootPath
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Masing-masing menyebabkan kesalahan yang sama.
Akar masalahnya adalah bahwa PublishSingleFile
biner tidak di-zip dan dijalankan dari temp
direktori.
Dalam hal aplikasi file tunggal ini, lokasi yang dicari appsettings.json
adalah direktori berikut:
C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs
Semua metode di atas menunjuk ke tempat file itu membuka ritsleting, yang berbeda dari tempat itu dijalankan.
sumber
Jika Anda baik-baik saja dengan menggunakan file saat runtime di luar yang dapat dieksekusi, maka Anda bisa menandai file yang Anda inginkan di luar, di csproj. Metode ini memungkinkan untuk perubahan langsung dan semacamnya di lokasi yang diketahui.
Jika ini tidak dapat diterima, dan HANYA memiliki satu file, saya melewati jalur file tunggal yang diekstrak sebagai jalur root di pengaturan host saya. Ini memungkinkan konfigurasi, dan pisau cukur (yang saya tambahkan setelah), untuk menemukan file-nya seperti biasa.
Catatan, untuk benar-benar membuat satu file, dan tanpa PDB, Anda juga perlu:
sumber
Aplikasi saya ada di .NET Core 3.1, diterbitkan sebagai file tunggal dan berjalan sebagai Layanan Windows (yang mungkin atau mungkin tidak berdampak pada masalah ini).
Solusi yang diajukan dengan
Process.GetCurrentProcess().MainModule.FileName
sebagai root konten bekerja untuk saya, tetapi hanya jika saya mengatur root konten di tempat yang tepat:Ini bekerja:
Ini tidak bekerja:
sumber