.NET Core Azure函数基于类的编排器找不到异常排查
问题分析与解决方案
核心结论
.NET Isolated Worker模式下的Azure Functions仍然支持基于类的编排器和活动,你的问题源于包版本不兼容、代码名称不匹配以及缺少显式注册步骤,而非特性被移除。
问题根源
- 包版本冲突:你混用了预览版
Microsoft.DurableTask.Generators(1.0.0-preview.1)与稳定版Microsoft.Azure.Functions.Worker.Extensions.DurableTask(1.2.2),二者兼容性差,导致类基编排器无法被自动发现注册。 - 编排器名称不匹配:客户端调用的是
DocumentProcessingOrchestrator,但实际编排器类是ABCOrchestrator,名称不一致直接导致找不到目标编排器。 - Isolated Worker模式要求显式注册:新版本Durable Task扩展在Isolated模式下不会自动扫描类基编排器,必须手动注册。
修复步骤
1. 统一Durable Task相关包版本
移除预览版生成器包,替换为兼容的稳定版Durable Task组件:
<!-- 删除预览版包 --> <!-- <PackageReference Include="Microsoft.DurableTask.Generators" Version="1.0.0-preview.1" /> --> <!-- 添加匹配的稳定版包 --> <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.2.2" /> <PackageReference Include="Microsoft.DurableTask.Client" Version="1.0.4" /> <PackageReference Include="Microsoft.DurableTask.Worker" Version="1.0.4" />
注:
Microsoft.DurableTask.Client和Microsoft.DurableTask.Worker版本需与Microsoft.Azure.Functions.Worker.Extensions.DurableTask兼容,建议使用对应稳定版本。
2. 修正编排器名称匹配
客户端代码中调用的编排器名称必须与实际类的DurableTask属性指定名称一致:
// 将DocumentProcessingOrchestrator改为ABCOrchestrator instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(ABCOrchestrator), dmsFileUploaded);
3. 显式注册类基编排器与活动
在Program.cs中添加Durable Task Worker配置,手动注册你的编排器和活动类:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { services.AddDurableTaskWorker(builder => { // 注册编排器 builder.AddOrchestrator<ABCOrchestrator>(); // 注册活动(如果有类基活动) builder.AddActivity<SomeActivity>(); }); }) .Build(); host.Run();
4. 清理编排器属性的冗余空格
确保DurableTask属性的名称参数无多余空格:
// 移除属性中的空格 [DurableTask(nameof(ABCOrchestrator))] public class ABCOrchestrator : TaskOrchestrator<string, string> { // ... 现有代码 }
补充说明
基于类的编排器/活动是Durable Task Framework的原生特性,在Isolated Worker模式下完全支持,只是相较于旧的In-Process模式,包依赖和注册逻辑有调整。只要确保版本兼容、名称匹配、显式注册,就能恢复正常运行。
内容的提问来源于stack exchange,提问作者amit jhatakia
相关产品推荐
相关产品推荐

