【问题标题】:Azure function dependency injection failures when multiple functions deployed部署多个函数时 Azure 函数依赖项注入失败
【发布时间】:2020-06-02 18:40:48
【问题描述】:

我遇到了一个问题,我在单个应用服务上部署了多个 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;
        }
    }

依赖关系:

传送门设置:

【问题讨论】:

  • 请将您的Startup 班级注册到您的DI
  • @JSteward 已更新。
  • @josh 既然你只在Azure上运行时遇到过这个问题,那么你在Azure上的host.json是什么?进入Function AppSettings Dialog查看host.json文件中是否有extensionBundle,如果有,删除保存。
  • @BowmanZhu host.json 基本上是空的,只是{}
  • @josh 我面临同样的问题。您找到解决方案了吗?

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


【解决方案1】:

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

services.AddTransient<IAzureTableStorageService, AzureTableStorageService>();

其中AzureTableStorageService 是实现IAzureTableStorageService 的类。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2020-01-19
      相关资源
      最近更新 更多