Внедрение моих настроек в контроллер работает в режиме отладки, но не в версии - PullRequest
0 голосов
/ 20 февраля 2019

Я очень новичок в Asp.Net Core, поэтому я почти уверен, что делаю глупости, но не могу понять, в чем проблема.Поэтому я написал в своем appsetting.json пару переменных, которые мне нужно получить во время выполнения.Следуя документации , я написал в своем стартапе в ConfigureService

services.AddOptions();
services.Configure<AppConfig>(Configuration.GetSection("AppConfig"));

, где AppConfig

- следующий класс

public class AppConfig
{
    public bool NeedToCheckSession { get; set; }
    public string ConnectionString { get; set; }
}

Конструктор моего контроллера следующий:

public MyController(IOptions<AppConfig> config)
{
    this.config = config;
}

Теперь, когда в Visual Studio я запускаю свой API в отладке через IIS Express, когда я отправляю запрос на мой контроллер, я могу достичь точки останова внутриКонструктор и конфигурация установлены правильно.Если затем я создаю Release своего проекта, выполняю webapi.exe и присоединяюсь к процессу с помощью Visual Studio, я вижу, что когда я отправляю тот же запрос, я непосредственно достигаю точки останова внутри метода, пропуская ту в конструкторе, сследствие того, что переменная config не установлена.В чем проблема?

Я добавляю вызов, который использую, чтобы проверить, правильно ли установлена ​​переменная config

        [Route("start")]
        [HttpPost]
        public HttpResponseMessage MyMethod([FromBody]UserSessionModel userSession)
        {
            HttpResponseMessage resp;


            MyWorker newSession = new MyWorker (config.Value.ConnectionString)
            {
                SessionFolder = sessionFolder
            };


            if (config.Value.NeedToCheckSession == true)
            {
               // i can't enter inside this if, cause even if in the appsetting.json the value is set to true, config is not passed to the controller
            }

, добавив также файл json

{
  "AppConfig": {
    "NeedToCheckSession": "true",
    "ConnectionString": "myconnstring;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

РЕДАКТИРОВАТЬ

Чтобы ответить на некоторый вопрос:

  • Нет, я не использую конструктор без параметров, у меня есть только тот, который я разместилвыше

  • Я пытался запустить API в режиме выпуска непосредственно в VS 2017, размещая его на IIS Express, и все же, когда я отправляю свой почтовый запрос, точка прерывания не попадает в конструктори переменная config не установлена.Если я запускаю API в отладке, он работает

  • Чтобы создать exe-файл, я просто создаю API в режиме выпуска и пытаюсь запустить его из папки Release внутри моего проекта.Я также пытался опубликовать API, но проблема все еще остается

EDIT2

Дальнейшие исследования показали, что по какой-то причине, в следующемConfigureService

   // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddOptions();
        services.Configure<AppConfig>(Configuration.GetSection("AppConfig"));
        services.AddHostedService<QueuedHostedService>();
        services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();
        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "My Web Api", Version = "v1" });
            // Set the comments path for the Swagger JSON and UI.
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            c.IncludeXmlComments(xmlPath);
        });
    }

Следующие инструкции полностью игнорируются (то есть пропускаются) при запуске API в выпуске.

        services.Configure<AppConfig>(Configuration.GetSection("AppConfig"));
        services.AddHostedService<QueuedHostedService>();
        services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();

, пока этого не происходит при отладке

Ответы [ 2 ]

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

Так что оказалось, что это не было проблемой, связанной исключительно с кодом, но я обнаружил, что мне пришлось отключить опцию «Оптимизировать код» на вкладке сборки в свойствах моего проекта, потому что это испортило мой отладчик

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

Использование ConfigurationBuilder:

 private static IConfigurationRoot Get(string path, string[] args = null, string environmentName = null)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(path)
                .AddJsonFile("appsettings.json", true, true)
                .AddCommandLine(args ?? new string[0]);

            if (!environmentName.IsNullOrWhiteSpace()) builder = builder.AddJsonFile($"appsettings.{environmentName}.json", true, true);

            builder = builder.AddEnvironmentVariables();

            return builder.Build();
        }

и:

   var host = new WebHostBuilder()
                    ...

                    .UseConfiguration(AppConfigurations.Get(root, args, Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")))
                    .UseEnvironment(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
                    .Build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...