Azure Durable Function加载IDurableOrchestrationClient失败求助
问题根因
这个类型加载异常本质是Durable Task扩展的程序集版本绑定冲突:
- 你项目中引用的是
Microsoft.Azure.WebJobs.Extensions.DurableTask 2.7.1版本,IDurableOrchestrationClient接口和[DurableClient]绑定特性都是2.x版本新增的内容;但Azure Functions 3.0运行时默认加载的是1.x版本的Durable Task扩展程序集,1.x版本中既没有这个接口,也没有对应绑定特性,运行时在1.0.0.0版本的程序集里找2.x才存在的类型,就会抛出这个加载错误。 - 额外的冲突诱因:你手动单独安装的
Microsoft.Azure.DurableTask.AzureStorage、Microsoft.Azure.DurableTask.Core两个包属于Durable扩展的底层依赖,不需要手动在项目中引用,手动指定版本很容易造成依赖链版本不一致,放大程序集加载冲突的概率。
修复步骤
- 清理冗余包引用
打开项目的csproj文件,删除手动添加的Microsoft.Azure.DurableTask.AzureStorage和Microsoft.Azure.DurableTask.Core两个包引用,这两个包会作为Durable WebJobs扩展的依赖自动还原,手动指定版本反而会导致依赖版本错乱。 - 安装兼容版本的Durable扩展
对于.NET Core 3.1 + Azure Functions 3.0运行时的组合,Microsoft.Azure.WebJobs.Extensions.DurableTask 2.6.1是兼容性验证最充分的版本,不会出现程序集绑定冲突。可以直接在NuGet包管理器中指定版本安装,也可以直接修改csproj中的包引用配置:<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.6.1" /> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.13" /> - 清理部署残留
如果是发布到Azure云环境后出现的报错,发布时勾选"删除目标位置的现有文件"选项,避免旧版本的dll残留在站点目录下,导致运行时加载错误版本的程序集。 - 代码验证
你当前的函数代码本身没有语法问题,修复包版本后放开注释的业务逻辑即可正常运行,可参考的完整实现如下:public static class Function1 { [FunctionName("Function1")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, [DurableClient] IDurableOrchestrationClient client, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); string productId = req.Query["productId"]; log.LogInformation("Got product Id {productId}", productId); string orchestrationId = await client.StartNewAsync("SyncOrchestrator", productId); return client.CreateCheckStatusResponse(req, orchestrationId); } }
排查补充
- 本地调试时要使用v3大版本的Azure Functions Core Tools,不要用v2或v4版本的Core Tools运行3.0版本的函数项目,否则也会出现内置扩展版本不匹配的问题。
- 不要在.NET Core 3.1 + Functions 3.0的技术栈组合中使用2.7.0及以上版本的Durable Task扩展,高版本扩展已经适配更高版本的函数运行时,和3.0运行时存在天然兼容性问题,强行使用会出现各类不可预期的加载、运行错误。
内容的提问来源于stack exchange,提问作者webber
相关产品推荐
相关产品推荐

