gpt4 book ai didi

c# - 如何让我的 .NET Core 3 单文件应用程序找到 appsettings.json 文件?

转载 作者:行者123 更新时间:2023-12-02 00:58:59 26 4
gpt4 key购买 nike

应如何配置单文件 .Net Core 3.0 Web API 应用程序以查找与单文件应用程序构建到的同一目录中的 appsettings.json 文件?

运行后

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

目录如下所示:

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

但是,尝试运行 APPNAME.exe 会导致以下错误

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()
...

我尝试了 similar, but distinct question 中的解决方案,以及其他 Stack Overflow 问题。

我尝试将以下内容传递给SetBasePath()

  • Directory.GetCurrentDirectory()

  • 环境.ContentRootPath

  • Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)

每个都导致相同的错误。

问题的根源在于 PublishSingleFile 二进制文件被解压缩并从 temp 目录运行。

对于这个单文件应用程序,它查找的位置 appsettings.json 是以下目录:

C:\Users\USERNAME\AppData\Local\Temp\.net\APPNAME\kyl3yc02.5zs

以上所有方法都指向文件解压到的位置,该位置与文件运行的位置不同。

最佳答案

我在 GitHub 上发现了一个问题 here标题为PublishSingleFile,不包括应用程序设置未按预期工作

这指出了另一个问题 here标题为单个文件发布:AppContext.BaseDirectory 未指向 apphost 目录

其中的解决方案是尝试 Process.GetCurrentProcess().MainModule.FileName

以下代码将应用程序配置为查看运行单个可执行应用程序的目录,而不是二进制文件提取到的位置。

config.SetBasePath(GetBasePath());
config.AddJsonFile("appsettings.json", false);

GetBasePath() 实现:

private string GetBasePath()
{
using var processModule = Process.GetCurrentProcess().MainModule;
return Path.GetDirectoryName(processModule?.FileName);
}

关于c# - 如何让我的 .NET Core 3 单文件应用程序找到 appsettings.json 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com