【发布时间】:2014-01-03 15:23:27
【问题描述】:
我刚刚将 Newtonsoft.Json 库从 4.5.1 更新到 5.0.8。我注意到其中一条异常消息发生了变化。一旦无法反序列化该值,我的 400 响应中将包含以下内容,“错误转换值...”。现在,此消息在 4.5.1 中有所不同。版本的库。问题是对象的全名被暴露了,这对我来说是一种不受欢迎的行为。
为了澄清:
问题如下。直到 Newtonsoft.Json 库的 4.5.1 版本,一旦抛出 JsonSerializationException,响应中的消息只是指出某个对象无法被序列化。从那个版本开始,响应消息中的库,是的,它包括错误消息,还包括它未能序列化到的对象的全名。很遗憾,因为我不想将错误消息中的命名空间暴露给外界。
我刚刚检查了JSON库的源代码,我发现StringEnumConverter中的代码现在是:
catch (Exception ex)
{
throw JsonSerializationException.Create(reader, "Error converting value {0} to type '{1}'.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.FormatValueForPrint(reader.Value), objectType), ex);
}
同时,它抛出默认的Enum.Parse ArgumentException 并显示消息“必须指定有效信息以解析字符串”。之前。
现在,我更喜欢这条消息,因为它没有向用户显示我的 API 的内部命名空间。
我试图在我的 Application_Start 方法中连接事件 JsonFormatter.SerializerSettings.Error,但是我无法执行我想要执行的操作。 我有机会访问我要处理的异常,
private static void Error(object sender, ErrorEventArgs errorEventArgs)
{
if (errorEventArgs.ErrorContext.Error.GetType() == typeof(JsonSerializationException))
{
但是所有属性都是只读的,我想修改的对象都被标记为内部的。重新抛出异常也不例外。
为清楚起见,请查看 Newtonsoft.Json.Net40 项目中的 StringEnumConverter 和 JsonSerializerInternalBase 类。
您知道在哪里挂钩有问题的库以覆盖错误消息吗?或者关于如何解决问题的任何其他想法(停止在错误消息中显示完整的命名空间)?
我的问题是,我能否以某种方式重新抛出异常并指定不同的消息,比如 4.5.1 中的消息?
【问题讨论】:
标签: c# json.net asp.net-web-api