Функция 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
.
Все та же ошибка.