5

工具:VS2017、ASP.NET Core 2、Entity Framework Core 2、ASP.NET Core JavaScript Services

我正在使用以下 BuildWebHost 方法:

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
    .UseStartup<Startup>()
    .UseNLog()
    .Build();

为了加载连接字符串,我在 ConfigureServices (startup.cs) 中有以下代码:

Action<DbContextOptionsBuilder> optionsAction = options =>
    options.UseSqlServer(Configuration.GetConnectionString("RecipeDatabase")); 
services.AddDbContext<RecipeContext>(optionsAction);

使用上述配置,应用程序在调试模式和 Windows 服务(发布后)下运行没​​有问题。

但是,如果我运行 add-migration,该工具将无法从 appsettings.json 加载连接字符串:

在此处输入图像描述

如果我这样评论以下行

//.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))

add-migration 运行没有问题,但应用程序作为“Windows 服务”运行不是因为它找不到 appsettings.json 文件。

如何修改配置以便不再需要注释上述行?

谢谢你。

迈克尔

4

3 回答 3

7

您可能想要覆盖 DbContext 中的 OnConfiguring 方法。这是我正在使用的示例。只要您使用命令行或 Windows 服务,它就会起作用:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (optionsBuilder.IsConfigured)
    {
        base.OnConfiguring(optionsBuilder);
        return;
    }

    string pathToContentRoot = Directory.GetCurrentDirectory();
    string json = Path.Combine(pathToContentRoot, "appsettings.json");

    if (!File.Exists(json))
    {
        string pathToExe = Process.GetCurrentProcess().MainModule.FileName;
        pathToContentRoot = Path.GetDirectoryName(pathToExe);
    }

    IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
        .SetBasePath(pathToContentRoot)
        .AddJsonFile("appsettings.json");

    IConfiguration configuration = configurationBuilder.Build();

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

    base.OnConfiguring(optionsBuilder);
}
于 2018-03-27T11:09:18.557 回答
2

在开发环境中,最好使用“User Secrets”来存储配置,而不是 appsettings.json。您可以在解决方案资源管理器 > 项目的上下文菜单 > 管理用户密码中获得用户密码。

User Secrets 将配置存储在当前用户的 romaing 配置文件目录中,例如:C:\users\john\AppData\Roaming\Microsoft\UserSecrets\ProjectName012822aasd\secrets.json

虽然 User Secrets 选项仅适用于开发环境,但对于生产,您需要依赖其他配置管理,例如:Azure App Service 的 App Config。

这是微软关于用户机密的文档

于 2018-03-27T10:59:06.940 回答
0

我在 Program.cs 中包含了 secrets.json。该文件存储在存储库之外,并作为链接添加到项目中。之后,它的内容就可以访问了,例如Configuration["SectionName:SectionLine"]. SetBasePath代码行修复了在创建迁移等时访问此文件时出现的错误。

  public class Program
    {

        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                    Console.WriteLine($"Launched program with base at {basePath}");
                    config.SetBasePath(basePath);
                    config.AddJsonFile("secrets.json", optional: false, reloadOnChange: true);
                    config.AddJsonFile($"secrets.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
#if DEV_DB
                    config.AddJsonFile($"secrets.LocalDb.json", optional: true);
#endif
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
于 2021-10-22T12:16:01.497 回答