Почему в веб-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] атрибут свойства навигации, который вы не хотите сериализовать. Он по-прежнему будет сериализовать как родительский, так и дочерний объекты, но просто избегает цикла саморегуляции.