asp.net核心TestServer无法找到配置

时间:2017-04-19 13:00:54

标签: c# asp.net-core web-hosting

我正在使用 TestServer 创建一些测试,这是一个复杂配置的bootstrap,如下所示:

var config = new ConfigurationBuilder()
    .Build();

webHostBuilder = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .CaptureStartupErrors(true)
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<MockLicenseStartup>()
    .UseEnvironment("Development")
    .UseUrls("http://locahost");

testServer = new TestServer(webHostBuilder); 

我的&#34; asp.net核心&#34;项目,在我的测试项目中,我创建了多个 appsettings.json ,用于提供以下内容:

  • 连接字符串
  • 记录详细程度
  • 自定义栏目

我面临的问题是我的 MockLicenseStartup 中的Configuration类无法加载任何可用的appsettings.json。

MockLicenseStartup.cs中使用的代码就是这个:

public MockLicenseStartup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();

    Configuration = builder.Build();
}

当我调用 Configuration.GetConnectionString(&#34;&#34;)时,它会抛出异常,如果我进一步检查,我可以看到实际上没有加载任何配置。可能是与.UseContentRoot(Directory.GetCurrentDirectory())

的相对/绝对路径相关的问题

1 个答案:

答案 0 :(得分:3)

在测试环境中,

.SetBasePath(env.ContentRootPath)

env.ContentRootPath与production不同,如果我没记错的话,它被设置为test project的bin目录。因此,它将找不到appsettings.json文件。除非你在构建后将其复制到那里。

如果您是项目文件夹结构不会更改。你可以尝试硬编码appsettings.json&#34;这两行中的路径到达这些路径的位置。

.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true

如果这样做(它应该),你可以通过在代码中找到appsetting.json路径来使它更好。

下面是我自己的代码,它在测试环境中工作。

        var settingFilePath = getSettingFilePath(settingFileParentFolderName: "APIProject");

        var builder = new ConfigurationBuilder()
            .AddJsonFile(settingFilePath + _settingFileName, optional: true, reloadOnChange: true)
            .AddJsonFile(settingFilePath + "appsettings.Development.json", optional: true);

        var configuration = builder.Build();

getSettingFilePath()只是一个在Startup Project文件夹中找到设置文件路径的函数。

希望得到这个帮助。