现在可以在从 Windows 任务调度程序运行 .net 核心控制台应用程序时读取 appsettings.json 文件中存在的连接字符串

Posted

技术标签:

【中文标题】现在可以在从 Windows 任务调度程序运行 .net 核心控制台应用程序时读取 appsettings.json 文件中存在的连接字符串【英文标题】:Now able to read the Connection String present in appsettings.json file when running the .net core Console application from windows task scheduler 【发布时间】:2020-04-09 19:54:17 【问题描述】:

我有一个 .net 核心控制台应用程序,它正在从 appsettings.json 文件中读取连接字符串。当我从 Visual Studio 运行应用程序时,它工作正常。但是当我从任务调度程序运行这个控制台应用程序时,它无法从 appsettings.json 文件中读取连接字符串。

例外

异常:System.ArgumentNullException:值不能为空。 参数名称:connectionString at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(字符串值, 字符串参数名称)在 Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder optionsBuilder,字符串 connectionString,Action1 sqlServerOptionsAction) at GetValueFromDBCore.TestContext.OnConfiguring(DbContextOptionsBuilder optionsBuilder) in P:\Users\vivek.nuna\Redis\GetValueFromDBCore\GetValueFromDBCore\GetValueFromDBCoreContext.cs:line 25 at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() at Microsoft.EntityFrameworkCore.DbContext.get_Model() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.get_EntityType() 在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.get_EntityQueryable() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.System.Linq.IQueryable.get_Provider() 在 Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSqlRaw[TEntity](DbSet`1 源,字符串 sql,Object[] 参数)在 GetValueFromDBCore.Program.SetFreshDataInCache() 在 P:\Users\vivek.nuna\Redis\GetValueFromDBCore\GetValueFromDBCore\Program.cs:line 30 在 GetValueFromDBCore.Program.Main(String[] args) 中 P:\Users\vivek.nuna\Redis\GetValueFromDBCore\GetValueFromDBCore\Program.cs:line 18

DBCOnext 类:

class TestContext: DbContext
    
        public DbSet<EmployeeEntity> EmployeeEntity  get; set; 

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        

            var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

            IConfigurationRoot configuration = builder.Build();


            optionsBuilder.UseSqlServer(configuration.GetConnectionString("db_core_ef_first"));
        
    

CS Proj 文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="StackExchange.Redis" Version="2.0.601" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

注意我已通过发布控制台应用程序 exe 并将其提供给任务调度程序的 exe 路径。

【问题讨论】:

【参考方案1】:

我能够解决这个问题,我在代码 .SetBasePath(Directory.GetCurrentDirectory()) 中使用了 Directory.GetCurrentDirectory(),所以当我从 VS 运行时它工作正常。我用Assembly.GetEntryAssembly().Location 替换了它,现在它工作正常。

参考:https://***.com/a/56409888/6527049

【讨论】:

以上是关于现在可以在从 Windows 任务调度程序运行 .net 核心控制台应用程序时读取 appsettings.json 文件中存在的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 任务调度程序在虚拟环境中运行 python 脚本

如何从 Windows 任务调度程序在(ubuntu bash windows 10)上运行程序

Windows 2008 服务器任务调度程序不运行 .bat 批处理作业 [关闭]

Windows 任务调度程序可在几秒钟内执行任务

如何使用 Laravel 在 Windows 10 中运行任务调度程序

使用 Windows 任务调度程序和 xampp 服务器运行带有 curl 的 php 脚本