Я очень новичок в 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>();
, пока этого не происходит при отладке