依赖项注入无法启动功能

时间:2019-07-01 20:54:27

标签: c# azure dependency-injection azure-functions

Azure函数在本地运行良好,当通过Deployment Center(或发布)部署到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时,我收到此错误消息,如上面显示在仪表板上。

我能够将Debugger附加到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();
        }

似乎startupTypesnull,因此,在调用.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 :(得分:0)

最后,我最终没有使用依赖注入并在所需的函数中初始化对象。

答案 1 :(得分:0)

似乎是部署问题,您能否检查发布功能时是否在功能可执行文件旁边找到所有需要的二进制文件。