部署多个功能时,Azure功能依赖项注入失败

时间:2020-02-18 17:05:35

标签: c# .net-core dependency-injection azure-functions

我遇到了一个问题,即我在单个应用程序服务上部署了多个Azure函数,并且遇到依赖项注入错误。

  • Azure Function V2运行时
  • 只有一个功能启用时不会出错
  • 重新启动应用程序无济于事,但是如果我重新部署相同的二进制文件,该错误将在第一次运行时消失,然后在随后的运行中返回
  • 其他功能将显示相同的错误,但适用于不同的服务
  • 我尝试了远程调试,但是无法达到任何断点或触发异常视图
  • 在本地工作正常

这是Azure Function门户视图中的例外:

2020-02-19T06:34:33.432 [Error] Executed 'Logger' (Failed, Id=edfbcc63-09b6-4f9e-8ee3-81fe50fd9412)
System.InvalidOperationException : Unable to resolve service for type 'Cloud.Services.Storage.Azure.IAzureTableStorageService' while attempting to activate 'Cloud.Web.AzureFunctions.Functions.Logger.Logger'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)
   at lambda_method(Closure ,IServiceProvider ,Object[] )
   at Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance[T](IServiceProvider serviceProvider) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs : 37
   at Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance[T](IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs : 32
   at Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory`1.<>c__DisplayClass1_1.<.ctor>b__0(IFunctionInstanceEx i) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\ActivatorInstanceFactory.cs : 20
   at Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory`1.Create(IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\ActivatorInstanceFactory.cs : 26
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.CreateInstance(IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs : 44
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ParameterHelper.Initialize() at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs : 846
   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.TryExecuteAsyncCore(IFunctionInstanceEx functionInstance,CancellationToken cancellationToken) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs : 116

代码:

功能定义:

[assembly: WebJobsStartup(typeof(FunctionStartUp))]
namespace Cloud.Web.AzureFunctions.Functions.Logger
{
    public class Logger
    {
        private readonly IAzureTableStorageService _azureTableStorageService;
        public Logger(IAzureTableStorageService azureTableStorageService)
        {
            _azureTableStorageService = azureTableStorageService;
        }

        [FunctionName("Logger")]
        public async Task Run(
            [ServiceBusTrigger("logger", Connection = @"ServiceBusConnectionString")]
            EntityLogEntry myQueueItem,
            ILogger log,
            ExecutionContext context)
        {...}

启动:

public class FunctionStartUp : IWebJobsStartup
{
    public static ServiceProvider Container { get; private set; }

    public void Configure(IWebJobsBuilder builder)
    {
        Container = CoreAppModule.ConfigureServices(builder.Services).BuildServiceProvider();
    }
}
public class CoreAppModule
    {
        public static IServiceCollection ConfigureServices(IServiceCollection services)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("local.settings.json", true) //when deployed, all application settings must be stored in azure app configuration
                .AddEnvironmentVariables()
                .Build();

            services.SetupConnectionStrings(config);
            services.AddOptions();
            services.SetupAutoMapper();
            services.SetupMongoRepositories(config);
            services.SetupDbContextsEFCore();
            services.SetupDataServices(config);
            services.SetupServices(config);
            services.SetupInMemoryCache();
            services.SetupIntegrationServices(config);
            services.SetupStorageServices(config);
            services.SetupCrypto(config);
            services.SetupIntegrationLibraryServices(config);
            services.SetupFtpConnectionDetails(config);
            services.SetupServiceBus(config);
            services.SetupStartupInitialization(config);

            return services;
        }
    }

依赖项:

enter image description here

门户设置:

enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

似乎您在Startup类中没有正确injected IAzureTableStorageService,因此DI找不到它。引用IAzureTableStorageService所在的项目,并在Startup类中添加如下内容:

services.AddTransient<IAzureTableStorageService, AzureTableStorageService>();

其中AzureTableStorageService是实现IAzureTableStorageService的类。

答案 1 :(得分:0)

bin文件夹中有一个名为extensions.json的文件。您的启动呼叫将在该文件中注册。无论最新部署的哪个功能应用程序,该功能的启动调用都将被较早的功能的启动调用替换。因此,您需要采取措施将所有功能的启动调用都注册在此文件中。

enter image description here

enter image description here