Durable Functions独立模式下如何注册JsonConverter实现自定义序列化
Durable Functions 独立模式下注册自定义JsonConverter的方法
问题背景
将Durable Functions应用从进程内模式迁移至独立模式时,编排器与活动、活动间传递的部分消息需要自定义序列化。此前在进程内模式通过IMessageSerializerSettingsFactory注册JsonConverter,但该接口在独立模式中不可用,官方文档仅提及WorkerOptions.Serializer却未提供示例,需明确独立模式下注册自定义JsonConverter的方法。
已尝试的实现
Startup.cs
builder.Services.AddOptions<JsonSerializerOptions>() .Configure(options => { options.Converters.Add(MyConverter); options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); builder.Services.AddOptions<WorkerOptions>() .Configure(options => { options.Serializer = new JsonObjectSerializer( builder.Services.BuildServiceProvider() .GetRequiredService<JsonSerializerOptions>()); });
期望效果:
- 第二个配置让Functions运行时将自定义序列化用于所有操作(如活动间消息传递)
- 第一个配置用于自行序列化场景(如Http触发器返回
HttpResponseData),示例代码:
req.CreateResponse().WriteAsJsonAsync(poco, new JsonObjectSerializer( new JsonSerializerOptions(...)));
解决方案与确认
你的实现思路正确,但存在一处优化点:不要在Configure方法内调用BuildServiceProvider(),这会创建独立的服务实例,导致配置不共享。优化后的代码如下:
优化后的Startup.cs
builder.Services.AddOptions<JsonSerializerOptions>() .Configure(options => { options.Converters.Add(MyConverter); options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); // 通过依赖注入获取已配置的JsonSerializerOptions builder.Services.AddOptions<WorkerOptions>() .Configure<IOptions<JsonSerializerOptions>>((workerOptions, jsonOptions) => { workerOptions.Serializer = new JsonObjectSerializer(jsonOptions.Value); });
关键说明
- 运行时序列化:修改后的
WorkerOptions.Serializer会被Durable Functions运行时用于编排器与活动、活动间的所有消息序列化,自定义JsonConverter会完全生效。 - 自行序列化场景:如果需要在Http触发器等场景复用同一套配置,直接注入
IOptions<JsonSerializerOptions>即可,无需重复创建配置实例:
// 在Http触发器类中注入依赖 private readonly IOptions<JsonSerializerOptions> _jsonOptions; public MyHttpTrigger(IOptions<JsonSerializerOptions> jsonOptions) { _jsonOptions = jsonOptions; } [Function("MyHttpTrigger")] public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req) { var poco = new MyPoco(); var response = req.CreateResponse(); await response.WriteAsJsonAsync(poco, new JsonObjectSerializer(_jsonOptions.Value)); return response; }
这样既保证了运行时和自定义场景使用同一套序列化配置,又避免了重复创建服务实例的问题。
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

