Ответ 1
Мне удалось решить проблему, используя более новую версию JSON.NET(8, где до того, как мы использовали версию 6). Это устранило ошибку.
У нас есть проект 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'."}
Мне удалось решить проблему, используя более новую версию JSON.NET(8, где до того, как мы использовали версию 6). Это устранило ошибку.
Что я понимаю из этого кода, так это то, что вы просто пытаетесь установить для IgnoreSerializableAttribute вашего распознавателя значение true.
1 > Знаете ли вы, почему это нужно сделать? Каков эффект, если вы его удалите? Я могу видеть из Newton Doc, что установка IgnoreSerializableAttribute в true приведет к тому, что Newtonsoft.Json будет вести себя как сериализаторы Microsoft и вместо этого просто сериализует общедоступные свойства.
Вам все еще нужно?
2 > Каков тип ваших текущих настроек SerializerSettings (мы знаем это не по умолчанию, так что вы, вероятно, его где-то меняете?) Уверены ли вы, что он по умолчанию по умолчанию игнорирует IgnoreSerializableAttribute? Если это так, у вас есть способ достичь этого атрибута с использованием фактического типа?
Надеюсь, что это поможет