首页 > 解决方案 > 部署多个函数时 Azure 函数依赖项注入失败

问题描述

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

这是 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;
        }
    }

依赖项:

在此处输入图像描述

门户设置:

在此处输入图像描述 在此处输入图像描述

标签: c#.net-coredependency-injectionazure-functions

解决方案


bin 文件夹中有一个名为 extensions.json 的文件。您的启动调用在该文件中注册。无论哪个函数应用最新部署,该函数的启动调用都将替换为早期函数的启动调用。因此,您需要采取行动,将所有函数的启动调用都注册到此文件中。

在此处输入图像描述

在此处输入图像描述


推荐阅读