ASP.NET Core配置文件设置JsonWriterOptions Encoder无效问题咨询
ASP.NET Core JSON日志配置文件设置Encoder不生效的原因
我使用Microsoft.Extensions.Logging提供的ASP.NET Core JSON日志功能,通过代码配置Encoder可以正常工作:
builder.Logging.AddJsonConsole(config => { config.JsonWriterOptions = new JsonWriterOptions { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; });
但尝试用配置文件设置相同逻辑时却不生效,配置内容如下:
{ "Logging": { "Console": { "FormatterOptions": { "JsonWriterOptions": { "Encoder": "System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping" } } } } }
核心原因
- ASP.NET Core的配置绑定系统只支持基本数据类型(字符串、数字、布尔等)和可通过无参构造函数实例化、仅需设置简单属性的对象。
JsonWriterOptions里的Encoder是JavaScriptEncoder类型,属于抽象类的实例,配置系统没办法把字符串形式的类型路径直接转换成对应的编码器实例。- 代码方式能生效,是因为直接调用了静态属性
UnsafeRelaxedJsonEscaping——这是一个已经实例化好的编码器对象,而配置文件做不到这种类型的实例化和引用。
替代方案
如果想通过配置文件控制这个行为,可以自定义一个开关项,再在代码里根据配置手动赋值:
调整后的配置文件
{ "Logging": { "Console": { "FormatterOptions": { "UseUnsafeRelaxedJsonEscaping": true } } } }
对应的代码逻辑
var useUnsafeEncoder = builder.Configuration.GetValue<bool>("Logging:Console:FormatterOptions:UseUnsafeRelaxedJsonEscaping"); builder.Logging.AddJsonConsole(config => { if (useUnsafeEncoder) { config.JsonWriterOptions = new JsonWriterOptions { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; } });
内容的提问来源于stack exchange,提问作者daniil_
相关产品推荐
相关产品推荐

