Почему в веб-api, возвращающем объект, который имеет отношение от одного до многих, вызывает ошибку?
Ребята У меня есть отношение "Один ко многим" к тому же классу, который называется пользователем,
Я возвращаю один экземпляр пользователя в методе web apis get
он отлично работает, поскольку у меня нет никаких
User
ID | Name
0 | A
1 | B
Friends Table ( This table is used to build the one to many relationship )
User_ID | Friend_ID
1 | 0
0 | 1
Это мой метод GetMethod
[HttpGet]
public Models.User Authenticate()
{
try
{
return db.Users.SingleOrDefault(x => x.ID == 0 ) ;
}
catch
{
return null;
}
}
Если я получу и верну субъект пользователя, я получаю сообщение об ошибке
Кто-нибудь может помочь мне исправить эту ошибку ниже?
{ "Сообщение": "Произошла ошибка.", "ExceptionMessage": "Тип объекта ObjectContent`1 не смог сериализовать тело ответа для типа контента" text/html; charset = utf-8 ".," ExceptionType ":" System.InvalidOperationException "," StackTrace ": null," InnerException": { "Сообщение": "Произошла ошибка.", "ExceptionMessage": "Self-референтный цикл обнаружен с типом "System.Data.. Путь 'Entity.DynamicProxies.Friend_E5C79F4736EB2750392FFC7061B18E9C12F15F9583409603C75C5D1B1F7358D4' Friends1 [0].User.Friends" "ExceptionType.": "Newtonsoft.Json.JsonSerializationException" "StackTrace": "в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter автор, значение объекта, свойство JsonProperty, контракт JsonContract, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, значения IWrappedCollection, контракт JsonArrayContract, член JsonProperty, JsonContainer Контракт collectionContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, значение Object, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization. JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, значение Object, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, значение Object, JsonObjectContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty содержит rProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, значение Object, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList( JsonWriter, IWrappedCollection, JsonArrayContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, значение Object, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty )\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, значение Object, JsonObjectContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serial ization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, значение Object, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, значение объекта)\r\n на Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, значение объекта)\r\n в Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, значение Object)\r\n в System.Net.Http.Formatting.JsonMediaTypeFormatter. < > c__DisplayClassd.b__c()\r\n в System.Threading.Tasks.TaskHelpers.RunSynchronously(действие action, CancellationToken token)" }}
Ответы
Ответ 1
Попробуйте изменить форматтера webApi. Добавьте эти строки в WebApiConfig.cs:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
И добавьте эту строку:
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
Ответ 2
Применить
[JsonIgnore]
атрибут свойства навигации, который вы не хотите сериализовать. Он по-прежнему будет сериализовать как родительский, так и дочерний объекты, но просто избегает цикла саморегуляции.