我正在尝试一个函数,该函数的依赖项已按文档Use dependency injection in .NET Azure Functions中所述注入。我的启动类定义为:
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'.
是否存在已知问题?我不知道这个。唯一的区别是触发器类型。
我想弄清楚问题是依赖项注入不起作用,当未注入对EventGridTrigger
的依赖项时,HttpClient
没有问题。将构造函数更改为以下内容,并在由EventGridTrigger
触发时,该函数可以正常工作:
public ChangeProducer()
{
_httpClient = new HttpClient();
}
答案 0 :(得分:0)
我已成功使用以下程序包和Visual Studio 2019 16.1.3版进行了测试。
以下屏幕片段显示了调试步骤:
答案 1 :(得分:0)
在创建一个新的功能应用程序并慢慢构建它并与遇到问题的项目进行比较之后,我已经弄清了依赖注入问题。 host.json
文件包含一个名为extensionBundle
的属性。删除之后,依赖项注入将再次开始工作。整个属性如下所示:
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}