带有 EventGridTrigger 的 Azure Function 阻止 FunctionsStartup class 的 Configure 方法来自 运行

Azure Function with EventGridTrigger prevents FunctionsStartup class's Configure method from running

我正在尝试创建一个函数,该函数已按照文档 Use dependency injection in .NET Azure Functions 中的概述注入了依赖项。我的启动 class 定义为:

    using System.Runtime.CompilerServices;
    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection;

    [assembly: FunctionsStartup(typeof(MyFunctions.Startup))]

    namespace MyFunctions{    
      public class Startup : FunctionsStartup
      {
        public override void Configure(IFunctionsHostBuilder builder)
        {
          builder.Services.AddHttpClient();
        }
      }
    }

我在builder.Services.AddHttpClient() 语句上设置了一个断点以确保DI 已配置。 然后我使用 HttpTrigger:

定义我的函数
    using System;
    using System.Net.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.Extensions.Logging;

    namespace MyFunctions
    {
        public class ChangeProducer
        {
            private readonly HttpClient _httpClient;

            public ChangeProducer(IHttpClientFactory httpClientFactory)
            {
                _httpClient = httpClientFactory.CreateClient();
            }

            [FunctionName("ChangeProducer")]
            public void Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "Reservation")]HttpRequest request, ILogger log)
            {
                Console.WriteLine("foo");
            }
        }
    }

当我从 Visual Studio 运行 开始时,我在 Startup.Configure 中遇到了断点。 精彩!

然后我将函数更改为使用 EventGridTrigger:

    using System;
    using System.Net.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.Extensions.Logging;

    namespace MyFunctions
    {
        public class ChangeProducer
        {
            private readonly HttpClient _httpClient;

            public ChangeProducer(IHttpClientFactory httpClientFactory)
            {
                _httpClient = httpClientFactory.CreateClient();
            }

            [FunctionName("ChangeProducer")]
            public void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
            {
                Console.WriteLine("foo");
            }
        }
    }

一旦进行了该更改且没有其他更改,我不会点击 Startup.Configure 中的断点。此外,我知道 DI 失败了,因为当我尝试调用该函数时,我收到一条错误消息:

    Executed 'ChangeProducer' (Failed, Id=06ae8b88-07c4-4150-91e5-8b88400aed72)
    Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'System.Net.Http.IHttpClientFactory' while attempting to activate 'MyFunctions.ChangeProducer'.

是否存在已知问题?我想不通。唯一的区别是触发类型。

更新 2019-06-24 - 这只是依赖注入

我想澄清的是,依赖注入不起作用,当 HttpClient 的依赖未注入时,EventGridTrigger 没有问题。将构造函数更改为以下内容,当 EventGridTrigger:

触发时该函数工作正常
    public ChangeProducer()
    {
        _httpClient = new HttpClient();
    }

我已经成功测试了以下软件包和 Visual Studio 2019,版本 16.1.3。

以下屏幕片段显示了调试步骤:

  1. 在Start-up

  1. 通过POST调用一个函数

    http://localhost:7071/runtime/webhooks/EventGrid?functionName=Function1

在创建一个新的功能应用程序并慢慢构建它并与遇到问题的项目进行比较后,我发现了依赖项注入问题。 host.json 文件包含一个名为 extensionBundle 的 属性。一旦我删除依赖注入再次开始工作。整个 属性 看起来像这样:

    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[1.*, 2.0.0)"
    }