appSetting.Development.json не внедряется во время отладки в ASP.Net Core App - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующее в моих appSetting.json;

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "MailServiceSettings": {
    "SmtpServer": "<server>",
    "ToAddresses": [
      "email@domain.com",
      "email2@domain.com"
    ],
    "UserName": "username",
    "Password": "password"
  }
}

и в appSettings.Development.json у меня есть тонкое изменение;

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "MailServiceSettings": {
    "SmtpServer": "<server>",
    "ToAddresses": [
      "development@domain.com"
    ],
    "UserName": "username",
    "Password": "password"
  }
}

Это так, я могу отправлять текстовые сообщениянастройки отправителя на моем локальном хосте без бомбардировки живого почтового ящика.

Однако, когда я запускаю в режиме отладки, параметры из appSettings.json вводятся вместо appSettings.Development.json.

Мой Program.cs использует значение по умолчанию WebHostBuilder;

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

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
}

и настройте DI следующим образом в моем StartUp.cs;

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.Configure<MailServiceSettings>(Configuration.GetSection("MailServiceSettings"));

        // In production, the Angular files will be served from this directory
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "ClientApp/dist";
        });
    }

Затем, когда я отлаживаю и ломаю конфигурацию, я вижу, что appSettings.Development.json прочитано (как яво время отладки можно углубиться в разделы Configuration. Я вижу, что они добавляются как дополнительная запись, и я считаю, что WebHost.CreateDefaultbuilder добавляет файлы env.EnvironmentName по умолчанию).

Однако, когда я создаю экземплярметод контроллера;

public ContactController(IOptions<MailServiceSettings> mailSettings, IHostingEnvironment hostingEnvironment)
{
    _mailSettings = mailSettings;
    _hostingEnvironment = hostingEnvironment;
}

Я обнаружил, что 2x адрес электронной почты из appSettings.json вводится вместо appSettings.Development.json

Я также проверил env.IsDevelopment() во время выполнения иэто возвращается true.

Может кто-нибудь сказать мне, что я здесь делаю неправильно?

1 Ответ

0 голосов
/ 22 февраля 2019

У меня проблемы с поиском и официальным источником для этого, но, по сути, проблема в том, что IConfiguration в основном словарь и ключи и значения из источников конфигурации включены в него.Другими словами, в конце дня вы получите что-то вроде следующего в псевдокоде:

["MailServiceSettings:ToAddresses[0]"] = "email@domain.com"
["MailServiceSettings:ToAddresses[1]"] = "email2@domain.com"

Затем, когда ваша конфигурация appsettings.Development.json входит:

["MailServiceSettings:ToAddresses[0]"] = "development@domain.com"

Другими словами, у вас все еще есть два элемента в конфигурации.Единственный способ обойти это - иметь такие настройки только в вашей конкретной конфигурации.Если вы полностью удалите его из appsettings.json, а затем выполните:

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "MailServiceSettings": {
    "SmtpServer": "<server>",
    "UserName": "username",
    "Password": "password"
  }
}

appsettings.Development.json

{
  "MailServiceSettings": {
    "ToAddresses": [
      "development@domain.com"
    ]
  }
}

appsettings.Production.json

{
  "MailServiceSettings": {
    "ToAddresses": [
      "email@domain.com",
      "email2@domain.com"
    ]
  }
}

Тогда у вас правильно будет только один адрес в разработке и два в производстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...