Azure Durable Functions活动无法接收Uri类型参数问题
Azure Durable Functions (.NET Isolated) Uri类型Activity参数转换异常解决办法
当在.NET Isolated 7.0环境下使用Azure Durable Functions,传递Uri类型参数给Activity函数时,会抛出异常:
Cannot convert input parameter 'url' to type 'System.Uri' from type 'System.String'.
这是因为Orchestrator与Activity之间的参数通过序列化传递,默认的System.Text.Json序列化器会将Uri对象转为字符串,但Activity触发器无法自动将字符串反序列化为Uri类型。
解决办法
方法一:传递字符串并手动转换(推荐,简单直接)
修改Orchestrator代码,将Uri转为字符串传递;在Activity内部将字符串转换回Uri:
Orchestrator代码修改:
[Function("OrchestratorAsync")] public async Task<string> OrchestratorAsync([OrchestrationTrigger] TaskOrchestrationContext context) { Uri uri = new Uri("https://test/sample.txt"); // 传递Uri的字符串表示 var result = await context.CallActivityAsync<string>("ActivityAsync", uri.ToString()); return result; }
Activity代码修改:
[Function("ActivityAsync")] public async Task<string> ActivityAsync([ActivityTrigger] string urlString) { if (Uri.TryCreate(urlString, UriKind.Absolute, out Uri url)) { Console.WriteLine(url); return "result"; } // 处理无效URL的情况 throw new ArgumentException("提供的URL格式无效", nameof(urlString)); }
方法二:自定义序列化配置(适合需要保持Uri类型传递的场景)
如果需要直接传递Uri对象,可以替换Durable Task的序列化器为Newtonsoft.Json(默认支持Uri类型的序列化/反序列化)。需要在项目中添加对应包,并在Program.cs中配置:
添加依赖包:
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask.NewtonsoftJson" Version="1.0.0" />
Program.cs配置:
builder.Services.AddDurableTask(options => { options.UseNewtonsoftJson(); });
配置后,原代码无需修改即可直接传递Uri参数。
适配依赖版本
你的项目使用的依赖版本:
Microsoft.Azure.Functions.WorkerVersion="1.10.0"Microsoft.Azure.Functions.Worker.Extensions.DurableTaskVersion="1.0.0"Microsoft.Azure.Functions.Worker.SdkVersion="1.7.0"
以上两种方法均适配当前版本。
内容的提问来源于stack exchange,提问作者DxG
相关产品推荐
相关产品推荐

