Инъекция зависимости не запускается - PullRequest
0 голосов
/ 01 июля 2019

Функция Azure работает нормально локально, при развертывании в Azure через Центр развертывания (или публикацию) функция не запускается, и на панели мониторинга Azure отображается

    Error:

    The function runtime is unable to start. System.Linq: Value cannot be null.
    Parameter name: source.
    Session Id: 353349c4b2c14b2399acd9fa26e79c0b

    Timestamp: 2019-07-01T20:29:51.503Z

Я занимаюсь разработкой функции запуска по таймеру, которая периодически обрабатывает данные из базы данных (используя EntityFramework). Функция отправляет сообщения в StorageQueue. Я проверил локально, все вроде работает, функция запускается, обращается к БД, обрабатывает данные и отправляет сообщения в StorageQueue, никаких проблем.

При развертывании в Azure на панели инструментов отображается это сообщение об ошибке, как показано выше.

Я смог присоединить отладчик к функции в VS2019 и обнаружил, что в пространстве имен Microsoft.Azure.WebJobs.Script.DependencyInjection создается файл ScriptStartupTypeLocator.cs.

.

Фактическая функция

public Type[] GetStartupTypes()
        {
            IEnumerable<Type> startupTypes = GetExtensionsStartupTypesAsync().ConfigureAwait(false).GetAwaiter().GetResult();

            return startupTypes
                .Distinct(new TypeNameEqualityComparer())
                .ToArray();
        }

Кажется, что startupTypes - это null, поэтому, когда вызывается .Distinct(), генерируется исключение.

Я остановил функцию и вижу, что на моей машине startupTypes содержит 3 элемента:

  • Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageWebJobsStartup
  • Microsoft.Azure.WebJobs.ServiceBus.ServiceBusWebJobsStartup
  • PlexusDataFeeds.Startup

Дополнительная информация:

  • SDK, Micorsoft.NETCode.App (2.0.0)
  • Microsoft.NET.Sdk.Functions (1.0.29)
  • Microsoft.EntityFrameworkCore (2.2.4)

Startup.cs

 class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {

            string SqlConnection = Environment.GetEnvironmentVariable("PlexusContextConnection");
            var serviceProvider = builder.Services.AddDbContext<PlexusContext>(
                options => options.UseSqlServer(SqlConnection))
            .AddLogging()
            .BuildServiceProvider();
        }
    }

functions.json

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.29",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "timerTrigger",
      "schedule": "0 */1 * * * *",
      "useMonitor": true,
      "runOnStartup": false,
      "name": "myTimer"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/PlexusDataFeeds.dll",
  "entryPoint": "PlexusDataFeeds.DataFeedSelector.DataFeedSelector.Run"
}

host.json

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[3.0.6]"
  }
}

extensions.json (из Azure)

{
  "extensions":[
    { "name": "AzureStorage", "typeName":"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage, Version=3.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"},
    { "name": "ServiceBus", "typeName":"Microsoft.Azure.WebJobs.ServiceBus.ServiceBusWebJobsStartup, Microsoft.Azure.WebJobs.ServiceBus, Version=3.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"},
    { "name": "Startup", "typeName":"PlexusDataFeeds.Startup, PlexusDataFeeds, Version=0.0.0.1, Culture=neutral, PublicKeyToken=null"}
  ]
}

редактировать

Фактическое исключение System.ArgumentNullException: 'Value cannot be null.' для startupTypes.

редактировать 2 Я удалил пакет Willezone.Azure.WebJobs.Extensions.DependencyInjection NuGet и вместо него использовал Microsoft.Extensions.DependencyInjection.

Все та же ошибка.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Кажется, это проблема развертывания, можете ли вы проверить, все ли необходимые двоичные файлы находятся в выпуске рядом с исполняемым файлом функции.

0 голосов
/ 03 июля 2019

В конце концов я не использовал Внедрение зависимостей и не инициализировал объекты в нужных мне функциях.

...