Конфигурации ввода-вывода генерирует случайное исключение NullReferenceException - AspNetCore 2.2 - PullRequest
1 голос
/ 26 марта 2020

У меня есть приложение WebApi, предназначенное для net framework 4.6.1 и использующее AspNetCore 2.2:

Настройка:

public void ConfigureServices(IServiceCollection services)
{            
    services.Configure<EmailConfig>(Configuration.GetSection("EmailConfig"));

    services.AddTransient<IEmailService, EmailService>();
}

Инъекция:

public EmailService(IOptions<EmailConfig> emailConfig)
{
    _emailConfig = emailConfig.Value;
}

С первого взгляда программа установки работает нормально, но при некотором нагрузочном тестировании я заметил, что я получаю следующую ошибку, когда контейнер DI пытается получить IOptions<EmailConfig>:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.Extensions.Configuration.ConfigurationProvider.<>c__DisplayClass9_0.<GetChildKeys>b__0(KeyValuePair`2 kv)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__59`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__59`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__59`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext() 
   at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
   at Microsoft.Extensions.Configuration.ChainedConfigurationProvider.GetChildKeys(IEnumerable`1 earlierKeys, String parentPath)
   at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
   at Microsoft.Extensions.Configuration.ConfigurationRoot.GetChildrenImplementation(String path)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration configuration, Object instance, Action`1 configureOptions)
   at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
   at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
   at System.Lazy`1.CreateValue()

Кто-нибудь получал через этот тип проблема?

Позже Редактирование: удаление IOptions<EmailConfig> из EmailService и непосредственное введение IConfiguration, а затем получение моих emailConfigs из IConfiguration вручную, отлично работает и решает мою проблему. Но все же, чтобы соблюдать принципы ISP и So C при использовании конфигураций, рекомендуемый способ сделать это командой aspnetcore - использовать Шаблон параметров , но похоже, что он не всегда работает нормально.


Я начинаю думать, что, возможно, есть проблема с моей настройкой: aspnetcore 2.2 нацеливается на netFramework 4.6.1. Я попытаюсь обновить систему до последней версии netcore, а также сменить цель на netcore, чтобы проверить, воспроизводится ли проблема.

...