Подтвердить что ты не робот

"Невозможно передать объект типа" System.Net.Http.Formatting.JsonContractResolver "для ввода" Newtonsoft.Json.Serialization.DefaultContractResolver "."

У нас есть проект WEB API, который недавно был перенесен на новый сервер. Я запускаю свой проект после внесения некоторых дополнений в его "полезную нагрузку", но он неожиданно вызывает следующую ошибку:

Невозможно запустить объект типа 'System.Net.Http.Formatting.JsonContractResolver' для ввода типа 'Newtonsoft.Json.Serialization.DefaultContractResolver'.

Оскорбительная строка кода находится в global.asax:

  protected void Application_Start() {
        GlobalConfiguration.Configure(WebApiConfig.Register);

        var serializerSettings =
         GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
        var contractResolver =
           (DefaultContractResolver)serializerSettings.ContractResolver;
           contractResolver.IgnoreSerializableAttribute = true;
     }

Я считаю, что этот код был добавлен, потому что вывод по умолчанию API был XML, и нам нужно, чтобы он был JSON.

Выделение (DefaultContractResolver) вызывает подсказку, указывающую, что она ссылается на NewtonSoft.JSon.Serialization.DefaultContractResolver. Выделение serializersettings.ContractResolver ссылки IContractResolver JSonSerializerSettings.ContractResolver.

Код был на этом компьютере в течение некоторого времени, и единственное, что, я думаю, я изменил, это установка более новой версии .NET.

Что может заставить эту строку кода внезапно вызвать ошибку? И как я могу его решить?

Спасибо!

Изменить: согласно запросу в комментариях мой код сериализации состоит из следующего:

json += "{\"employeename\": \"" + Convert.ToString(reader["Employee"])
+ "\"},";

return JsonConvert.DeserializeObject<OrgChartModel>(json);

Edit2: теперь мы запускаем .NET 4.5. Насколько я знаю, мы запустили 4.2 ранее, но, увидев, что прошло несколько месяцев, я не могу быть уверен.

В соответствии с комментарием Dominick, я попытался изменить приведение к DefaultContractResolver на следующее:

            var contractResolver =
          (IContractResolver)serializerSettings.ContractResolver;

Это, однако, затем заканчивается в API, возвращающем следующую ошибку:

{"Message":"The requested resource does not support http method 'GET'."}

4b9b3361

Ответ 1

Мне удалось решить проблему, используя более новую версию JSON.NET(8, где до того, как мы использовали версию 6). Это устранило ошибку.

Ответ 2

Что я понимаю из этого кода, так это то, что вы просто пытаетесь установить для IgnoreSerializableAttribute вашего распознавателя значение true.

1 > Знаете ли вы, почему это нужно сделать? Каков эффект, если вы его удалите? Я могу видеть из Newton Doc, что установка IgnoreSerializableAttribute в true приведет к тому, что Newtonsoft.Json будет вести себя как сериализаторы Microsoft и вместо этого просто сериализует общедоступные свойства.

Вам все еще нужно?

2 > Каков тип ваших текущих настроек SerializerSettings (мы знаем это не по умолчанию, так что вы, вероятно, его где-то меняете?) Уверены ли вы, что он по умолчанию по умолчанию игнорирует IgnoreSerializableAttribute? Если это так, у вас есть способ достичь этого атрибута с использованием фактического типа?

Надеюсь, что это поможет