使用依赖注入时未注册持久的 Azure 函数绑定类型
Posted
技术标签:
【中文标题】使用依赖注入时未注册持久的 Azure 函数绑定类型【英文标题】:Durable Azure function binding types not registered when using dependency injection 【发布时间】:2020-06-15 23:54:25 【问题描述】:我从 Visual Studio“添加新功能”到项目中创建了一个标准的持久功能。开箱即用,效果很好。
然后我按照这里的步骤:https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection 添加依赖注入。添加 Microsoft.Extensions.http。
这破坏了功能,我得到了错误:
[03-Mar-20 14:58:18] The 'test' function is in error: The binding type(s) 'orchestrationTrigger' are not registered. Please ensure the type is correct and the binding extension is installed.
[03-Mar-20 14:58:18] The 'test_Hello' function is in error: The binding type(s) 'activityTrigger' are not registered. Please ensure the type is correct and the binding extension is installed.
[03-Mar-20 14:58:18] The 'test_HttpStart' function is in error: Microsoft.Azure.WebJobs.Host: Error indexing method 'test_HttpStart'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'starter' to type IDurableOrchestrationClient. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).
在这种状态下,startup.cs 不会运行,这在我之前创建的函数中从未发生过,但我可以通过添加具有以下内容的 extensions.json 来解决此问题:
"extensions": [
"name": "Startup",
"typeName": "FunctionApp1.Startup, FunctionApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
]
这使得 startup.cs 中的 Configure 方法运行,但我仍然遇到相同的错误。
startup.cs
public override void Configure(IFunctionsHostBuilder builder)
builder.Services.AddHttpClient();
Function2.cs
公共类 Function2 [函数名(“测试”)] 公共异步任务> RunOrchestrator( [OrchestrationTrigger] IDurableOrchestrationContext 上下文) var 输出 = new List();
// Replace "hello" with the name of your Durable Activity Function.
outputs.Add(await context.CallActivityAsync<string>("test_Hello", "Tokyo"));
outputs.Add(await context.CallActivityAsync<string>("test_Hello", "Seattle"));
outputs.Add(await context.CallActivityAsync<string>("test_Hello", "London"));
// returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
return outputs;
[FunctionName("test_Hello")]
public string SayHello([ActivityTrigger] string name, ILogger log)
log.LogInformation($"Saying hello to name.");
return $"Hello name!";
[FunctionName("test_HttpStart")]
public async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]HttpRequestMessage req,
[DurableClient]IDurableOrchestrationClient starter,
ILogger log)
// Function input comes from the request content.
string instanceId = await starter.StartNewAsync("test", null);
log.LogInformation($"Started orchestration with ID = 'instanceId'.");
return starter.CreateCheckStatusResponse(req, instanceId);
我正在使用 .net core 3.1 Microsoft.Azure.Functions.Extensions 1.0.0
Microsoft.Azure.WebJobs.Extensions.DurableTask 2.1.1
Microsoft.Extensions.Http 3.1.2
Microsoft.NET.sdk.Functions 3.0.4
【问题讨论】:
【参考方案1】:现在,尝试将 Microsoft.NET.sdk.Functions 3.0.4 降级到以前的版本。团队进行了一些性能改进,但我看到有人提出同样的问题(DI 问题)
【讨论】:
Microsoft.NET.sdk.Functions 3.0.5 已发布,有报道称它修复了 DI 问题。 @eliashdezr 4 月 6 日 01:45 我可以确认所有与依赖注入相关的问题都已使用 Microsoft.NET.Sdk.Functions 包的 3.0.5 版本在本地解决和部署。以上是关于使用依赖注入时未注册持久的 Azure 函数绑定类型的主要内容,如果未能解决你的问题,请参考以下文章
如何注册 ServiceBusClient 以进行依赖注入?
Azure webjobs - Unity - 如何将范围内的依赖项注入其他类