最新版本中的异常消息更改

Mai*_*iOM 5 c# json.net asp.net-web-api

我刚刚将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);
}
Run Code Online (Sandbox Code Playgroud)

同时它抛出了默认值Enum.Parse ArgumentException,并显示消息"必须指定有效信息以便在字符串中进行解析".之前.

现在,我更喜欢这条消息,因为它没有向用户显示我的API的内部命名空间.

我试图在我的Application_Start方法中挂起事件JsonFormatter.SerializerSettings.Error,但是我无法做我想做的事情.我有机会访问我想要处理的异常,

private static void Error(object sender, ErrorEventArgs errorEventArgs)
{
    if (errorEventArgs.ErrorContext.Error.GetType() == typeof(JsonSerializationException))
    {
Run Code Online (Sandbox Code Playgroud)

但是所有属性都是只读的,我认为要修改的对象标记为内部.重新抛出异常也不是一个例子.

为清楚起见,请查看Newtonsoft.Json.Net40项目中的类StringEnumConverterJsonSerializerInternalBase类.

您是否知道在哪里挂钩有问题的库以覆盖错误消息?或者关于如何解决问题的任何其他想法(停止在错误消息中显示完整的命名空间)?

我的问题是,我可以以某种方式重新抛出一个异常,指定一个不同的消息,就像4.5.1中的那个消息一样吗?

Mai*_*iOM 5

一段时间后,我找到了一个有效的解决方案。我基本上创建了一个从 StringEnumConverter 派生的新转换器并覆盖 ReadJson 方法。

我的新转换器如下所示:

public class StringEnumConverterEx : StringEnumConverter
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // the message in the response, once an serialization exception is thrown, after the version 4.5.1 of Newtonsoft.JSON library,
            // has changed. As we do not want to expose the full namespace of our Enums, we are catching the exception and re-throwing it
            // with a different message.
            try
            {
                return base.ReadJson(reader, objectType, existingValue, serializer);
            }
            catch (JsonSerializationException)
            {
                string values = objectType.IsEnum ? String.Join(",", Enum.GetNames(objectType)) : string.Empty;

                throw new JsonSerializationException(string.Format("Error converting value {0}, possible values are: {1}",
                    objectType.Name, values));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,我只需在应用程序启动时添加此转换器,而不是原来的 StringEnumConverter 。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverterEx());
Run Code Online (Sandbox Code Playgroud)

这可以解决问题并覆盖异常消息。正如您所看到的,我还在消息中提供了该枚举的可能值。

希望这对其他人有帮助。

干杯