Blazor WASM中AppSettings动态反序列化异常解决方案咨询
Blazor WASM 动态配置反序列化异常解决方案
问题根源
Blazor WASM的默认配置绑定机制不识别[JsonExtensionData]特性,导致标记为JsonElement类型的AppSettings无法正确完成绑定,触发状态异常。其他配置项正常是因为它们是固定结构,能被配置绑定机制正确解析。
方案一:手动用System.Text.Json反序列化配置
绕开配置绑定的限制,直接读取配置节点的JSON字符串并手动反序列化:
- 修改Program.cs中的注册代码:
// 读取SDetails节点的原始JSON var sDetailsJson = builder.Configuration.GetSection(nameof(SDetails)).GetRawJson(); // 手动反序列化,保留System.Text.Json的特性支持 var sDetails = JsonSerializer.Deserialize<SDetails>(sDetailsJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); // 注册为单例服务 builder.Services.AddSingleton(sDetails); - 组件中直接注入
SDetails使用:[Inject] public SDetails SDetails { get; set; } // 访问AppSettings var dynamicSettings = SDetails.Revision.AppSettings;
方案二:自定义JsonElement配置绑定转换器
给配置绑定机制添加支持JsonElement的转换器:
- 创建转换器类:
public class JsonElementConverter : IConfigurationConverter<JsonElement> { public JsonElement Convert(object input) { // 处理字符串形式的JSON if (input is string jsonStr) { return JsonDocument.Parse(jsonStr).RootElement; } // 处理配置节点 if (input is IConfigurationSection section) { var rawJson = section.GetRawJson(); return JsonDocument.Parse(rawJson).RootElement; } throw new InvalidCastException($"无法将{input.GetType()}类型转换为JsonElement"); } } - 在Program.cs中注册转换器并配置服务:
// 添加自定义转换器 ConfigurationBinder.TypeConverters.Add(typeof(JsonElement), new JsonElementConverter()); // 正常注册配置选项 builder.Services.Configure<SDetails>(builder.Configuration); - 组件中正常注入
IOptions<SDetails>访问:[Inject] public IOptions<SDetails> SDetailsOptions { get; set; } // 使用时 var appSettings = SDetailsOptions.Value.Revision.AppSettings;
方案三:改用dynamic类型简化处理
如果不需要JsonElement的强类型操作,直接用dynamic替代:
- 修改Revision类的属性定义:
public class Revision { // 替换JsonElement为dynamic public dynamic AppSettings { get; set; } } - 注册和注入方式保持不变,直接访问动态属性:
[Inject] public IOptions<SDetails> SDetailsOptions { get; set; } // 示例访问动态配置项 var settingValue = SDetailsOptions.Value.Revision.AppSettings.YourSettingKey;
内容的提问来源于stack exchange,提问作者E.Benedos
相关产品推荐
相关产品推荐

