如何为Azure Function SignalR Service Binding自定义JSON序列化配置?
Azure Function SignalR Service输出绑定枚举序列化为字符串解决方案
全局配置方案
SignalR Service输出绑定扩展支持直接读取依赖注入容器中的序列化配置,无需手动修改扩展内部逻辑,两种序列化器的配置方式如下:
使用System.Text.Json(适用于v1.8.0+版本的SignalR扩展)
在进程内(In-Process)模式的Function启动类中注入序列化配置即可:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using System.Text.Json; using System.Text.Json.Serialization; [assembly: FunctionsStartup(typeof(YourNamespace.Startup))] namespace YourNamespace { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.Configure<JsonSerializerOptions>(options => { // 全局添加枚举转字符串转换器 options.Converters.Add(new JsonStringEnumConverter()); }); } } }
使用Newtonsoft.Json
同样在启动类中配置Newtonsoft的序列化设置:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Converters; [assembly: FunctionsStartup(typeof(YourNamespace.Startup))] namespace YourNamespace { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.Configure<JsonSerializerSettings>(settings => { // 全局添加枚举转字符串转换器 settings.Converters.Add(new StringEnumConverter()); }); } } }
独立工作进程(Isolated Worker)模式配置
如果使用Isolated模式运行Function,直接在Program.cs中添加配置即可:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { // System.Text.Json配置 services.Configure<JsonSerializerOptions>(options => { options.Converters.Add(new JsonStringEnumConverter()); }); // 若使用Newtonsoft则替换为对应配置即可 }) .Build(); host.Run();
说明:如需指定SignalR扩展优先使用的序列化器,可在应用配置中添加SignalR__Serializer设置,取值为SystemTextJson或NewtonsoftJson,默认使用Newtonsoft.Json。
单枚举生效方案
如果不需要全局所有枚举都序列化为字符串,仅需要特定枚举生效,可以直接在枚举定义上添加转换器特性,无需全局配置:
- 适配System.Text.Json:
[JsonConverter(typeof(JsonStringEnumConverter))] public enum MyBusinessEnum { OptionA, OptionB }
- 适配Newtonsoft.Json:
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum MyBusinessEnum { OptionA, OptionB }
注意:不要自行将业务对象序列化为JSON字符串后传入SignalR输出绑定,库会将字符串识别为普通值进行二次序列化,导致出现多余的转义字符,直接传入原始对象即可,上述配置会自动在序列化阶段生效,不会出现转义异常问题。
内容的提问来源于stack exchange,提问作者Ilya Chernomordik
相关产品推荐
相关产品推荐

