NET6孤立模型Azure Durable Functions:无法解析FunctionsDurableClientProvider服务
错误信息
Exception: System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Azure.Functions.Worker.Extensions.DurableTask.FunctionsDurableClientProvider' while attempting to activate 'Microsoft.Azure.Functions.Worker.Extensions.DurableTask.DurableTaskClientConverter'.
问题根源
在.NET孤立工作者模型中,Azure Durable Task扩展需要显式将相关服务注册到依赖注入容器中。你的Program.cs未完成这一步,导致DI容器无法解析Durable Client所需的依赖服务。
修复步骤
1. 更新Program.cs,注册Durable Task服务
修改ConfigureHostBuilder方法,在ConfigureFunctionsWorkerDefaults()之后添加.AddDurableTask()扩展方法,完成Durable服务的注册:
public static class Program { public static Task Main(string[] args) { var host = ConfigureHostBuilder(); return host.RunAsync(); } private static IHost ConfigureHostBuilder() { return Host.CreateDefaultBuilder() .ConfigureFunctionsWorkerDefaults() .AddDurableTask() // 新增:注册Durable Task服务 .UseConsoleLifetime() .Build(); } }
2. 修正host.json配置错误
你的host.json中,maxConcurrentActivityFunctions和maxConcurrentOrchestratorFunctions配置位置错误,它们应该属于durableTask节点的子配置,而非extensions的同级节点。修正后的配置如下:
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensions": { "durableTask": { "hubName": "MyTaskHub", "storageProvider": { "connectionStringName": "AzureWebJobsStorage", "controlQueueBatchSize": 32, "partitionCount": 4 }, "tracing": { "traceInputsAndOutputs": false, "traceReplayEvents": false }, "maxConcurrentActivityFunctions": 10, // 移至durableTask节点内 "maxConcurrentOrchestratorFunctions": 1 // 移至durableTask节点内 } } }
3. (可选)规范Orchestrator实现方式
在孤立工作者模型中,推荐使用属性标记的方式定义Orchestrator函数,而非继承TaskOrchestrator类(该方式属于旧版模型兼容写法)。示例如下:
public static class OrchestrationFunction { [Function(nameof(OrchestrationFunction))] public static async Task<bool> RunOrchestrator( [OrchestrationTrigger] TaskOrchestrationContext context, ILogger logger) { var inputList = context.GetInput<List<string>>(); string instanceId = context.InstanceId; logger.LogInformation($"Orchestrator function started. instanceId:{instanceId}"); // 业务逻辑实现 logger.LogInformation($"Orchestrator function completed."); return true; } }
4. 确认包版本兼容性
确保项目中所有Azure Functions Worker相关包版本相互兼容,当前你的包版本组合是兼容的,若后续升级包版本,需保证Microsoft.Azure.Functions.Worker、Microsoft.Azure.Functions.Worker.Sdk和Microsoft.Azure.Functions.Worker.Extensions.DurableTask的版本匹配。
内容的提问来源于stack exchange,提问作者elephant_rider

