如何获取.NET Core 3单文件应用程序以查找appsettings.json文件? - c#

如何配置单文件.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()
environment.ContentRootPath
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)

每个导致相同的错误。

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

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

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

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

参考方案

我在GitHub here上发现了一个标题为PublishSingleFile excluding appsettings not working as expected的问题。

那指向另一个名为single file publish: AppContext.BaseDirectory doesn't point to apphost directory的问题here

解决方案是尝试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);
}

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

从Axios请求以ASP.NET Core API返回下载文件 - c#

大家好我正在尝试从Axios Request从ASP.NET Core Web API下载文件。这是我的示例API方法。 (基于此stackoverflow question的代码)[HttpPost("download")] public async Task<IActionResult> DownloadFile(){ .…

为什么ASP Net Core 2.2不释放内存? - c#

我正在使用以下项目创建的默认项目来测试ASP Net Core 2.2:Visual Studio>文件>新建>项目> ASP NET Core Web应用程序>下一步>创建。在界面上按IIS Express按钮,然后自动转到https://localhost:44356/api/values编辑:重点是,我正在测试ASP…

调用SignalR Hub不适用于Asp.Net Core Web API - c#

我是SignalR的新手。我正在尝试设置一个Asp.Net Core WebAPI,以便其他客户端可以使用SignalR连接到它并获取实时数据。我的Hub类是:public class TimeHub : Hub { public async Task UpdateTime(string message) { await Clients.All.SendAs…

如何将POCO类传递给.NET Core配置 - c#

我正在进行.NET Core应用程序的集成测试,并且想要使用一些测试配置。我的配置是一个POCO类,该类通过appsettings.json配置,然后通过IOptions<T>使用。在我的测试中,我想使用该类的实例。这是代码: var mySettings = GetTestSettings(); // factory method return…