如果在发布文件夹外执行 dotnet,则 dotnet 不会加载 appsettings.json

时间:2021-07-02 19:32:33

标签: asp.net-core publish .net-5 appsettings

我已经在这个问题上徘徊了很长一段时间,但仍然没有找到答案,也没有找到另一篇处理相同问题的帖子。

我发布了一个 .net 5.0 网站,如果我在同一个发布的文件夹中运行 dotnet,一切正常。在此文件夹中,我还有一个名为 appsettings.json 的文件,其中包含应用程序所需的所有配置,即:

+ path
 + to
   + karinapi
     - MinosIT.Karin.API.dll
     - appsettings.json

当我在文件夹内运行 dotnet 时,一切正常,并且读取设置没有任何问题:

cd /path/to/karinapi
dotnet MinosIT.Karin.API.dll

结果没问题,即:

user@machine$ dotnet MinosIT.Karin.API.dll
info: MinosIT.Karin.API.Program[0]
      Inicializando migración
info: MinosIT.Karin.Migrations.HDIKarinMigrations[0]
      Verificando migraci+on
info: MinosIT.Karin.Migrations.HDIKarinMigrations[0]
      Checking whether journal table exists..
info: MinosIT.Karin.Migrations.HDIKarinMigrations[0]
      Fetching list of already executed scripts.
info: MinosIT.Karin.API.Program[0]
      finalizando migración     

但是当我尝试遵循本指南时: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0 它说你必须创建一个服务并像这样运行应用程序

/usr/bin/dotnet /path/to/karinapi/MinosIT.Karin.API.dll

问题是,当我尝试在发布文件夹之外运行我的应用程序时,dotnet 似乎没有找到 appsettings.json 文件,即:

user@mymachine$ pwd
/path/to/
user@mymachine$ /user/bin/dotnet /path/to/karinapi/MinosIT.Karin.API.dll

应用程序失败并抛出此错误:

 user@mymachine$ dotnet karinapi/MinosIT.Karin.API.dll
<块引用>

未处理的异常。 System.ArgumentNullException:值不能为空。 (参数'implementationInstance')

在 Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton[TService](IServiceCollection services, TService implementationInstance)
在 MinosIT.Karin.API.Startup.ConfigureServices(IServiceCollection services) 在 D:\Minos IT\Karin\MinosIT.Karin\BackEnd\MinosIT.Karin.api\Startup.cs:line 72
在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 在 /_/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo 中。 cs:line 399
在 Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(对象实例,IServiceCollection 服务)
在 Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass9_0.g__Startup|0(IServiceCollection serviceCollection)
在 Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.Invoke(对象实例,IServiceCollection 服务)
在 Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass8_0.b__0(IServiceCollection 服务)
在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services, Object instance)
在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.b__0(HostBuilderContext 上下文,IServiceCollection 服务)
在 Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
在 Microsoft.Extensions.Hosting.HostBuilder.Build()

我正在使用 Microsoft.Extensions.Configuration

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

    public IConfiguration Configuration { get; }
    ...

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

在我使用的 StartUp.ConfigureServices 中:

var connectionString = Configuration.GetConnectionString("ConnectionStringName");
var section = Configuration.GetSection("CustomSection").Get<CustomConfiguration>();

当我调试时,通过日志记录我的代码我知道问题可能是 ASP.NET Core 不知道从哪里读取 appsettings.json,我查看了 dotnet cli 文档、环境变量、其他配置类型我似乎找不到问题所在。我真的不知道还要寻找什么,任何指导或帮助将不胜感激。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

找到了一个解决方案,我在这里发布以防其他人遇到同样的错误:

Program.cs 内,我从:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }
                );

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, config) =>
                {
                    var assembly = Assembly.GetExecutingAssembly();
                    var currentPath = System.IO.Path.GetDirectoryName(assembly.Location);

                    config.SetBasePath(currentPath);
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }
                );