У меня есть приложение 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, чтобы проверить, воспроизводится ли проблема.