我刚刚将Newtonsoft.Json库从4.5.1更新到5.0.8.我注意到的是其中一条异常消息发生了变化.一旦该值无法反序列化,我的400响应"错误转换值..."中包含以下内容.现在,这条消息在4.5.1中有所不同.lib的版本.问题是对象的全名是暴露的,这对我来说是一种不良行为.
为了澄清:
问题如下.直到Newtonsoft.Json库的4.5.1版本,抛出JsonSerializationException后,响应中的消息才指定某个对象无法序列化.从该版本开始,响应消息中的库,是的,它包括错误消息,但也包括它无法序列化的对象的全名.遗憾的是,我不想将错误消息中的命名空间暴露给外界.
我只是检查JSON lib的源代码,我发现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中的那个消息一样吗?