Служба WCF REST не вернет детей Entities - PullRequest
4 голосов
/ 06 февраля 2012

Я написал службу WCF с шаблоном REST, для которого defaultOutgoingResponseFormat имеет значение Json.В соответствии с этим, я построил простую модель сущностей, используя Entity Framework и ObjectContext, для передачи пользовательских сущностей POCO.

Если я передаю одну сущность, система работает должным образом.Если я добавлю дочерние элементы к объекту, ответ REST будет пустым.В отладчике сущность заполняется правильно, но сама служба вообще ничего не возвращает.

Так, например, у меня есть метод Trip.Get ().Код WCF выглядит следующим образом:

[WebGet(UriTemplate = "{id}", ResponseFormat = WebMessageFormat.Json)]
public Model.Trip Get(string id)
{
    Model.Trip fetchedTrip = null;
    try
    {
        fetchedTrip = Library.Trip.Get(new Guid(id));
    }
    catch (Exception ex)
    {
        Debug.Write(ex.Message);
    }
    return fetchedTrip;
}

Library.Trip.Get выглядит так в рабочей версии:

public static Model.Trip Get(Guid tripId)
{
    using (Model.POCOTripContext context = new Model.POCOTripContext())
    {
        var tripEntity = context.Trips.FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip();
        return tripEntity;
    }
}

Возвращает ожидаемый результат, который выглядит следующим образом:

{"ArrivalDate": "/ Date (1334203200000-0400) /", "DepartureDate": "/ Date (1334721600000-0400) /", "Id": "d6413d96-fe1f-4b1c-ae7a-3bbf516cdc2f"," Name ":" Test 123 "," Photos ": null," PlacesOfInterest ": null," WhereTo ":" Orlando, FL "}

Если я изменю метод Library, добавив его в дочерние элементыОднако служба REST возвращает пустое значение.Ничего, нада.

public static Model.Trip Get(Guid tripId)
{
    using (Model.POCOTripContext context = new Model.POCOTripContext())
    {
        var tripEntity = context.Trips.Include("PlacesOfInterest").Include("Photos").Include("PlacesOfInterest.PoiAttributes").FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip();
        return tripEntity;
    }
}

Отладчик в службе WCF в операторе return показывает, что сущность заполнена полностью и правильно.

Я уверен, что мне просто не хватает некоторыхмагический атрибут, и я надеюсь, что кто-то, у кого есть этот купол, мог бы помочь мне!

1 Ответ

6 голосов
/ 06 февраля 2012

Согласно вашему небольшому тесту с удалением свойства обратной навигации, у вас есть проблема с сериализацией в JSON.Сериализация по умолчанию не может отслеживать ссылки на объекты, поэтому, когда она начинает сериализацию вашего Trip, оно следует за свойством навигации к интересующим точкам и в первом из них находит ссылку на Trip.Поскольку он не отслеживает ссылки, он следует свойству навигации и снова сериализует отключение (и снова следует его свойствам навигации) => бесконечный цикл.

Вы должны либо удалить свойство навигации отслеживания назад, как вы это делали в тесте, либо вы должны указать сериализатору либо отслеживать ссылки, либо исключить это свойство из сериализации (ну, я не уверен, что будет делать первый вариант вслучай JSON).Я предполагаю, что вы используете сериализацию WCF по умолчанию, поэтому:

  • Отметьте каждую сущность [DateContract(IsReference = true)], а каждое сериализованное свойство - [DataMember], чтобы начать отслеживать ссылки.
  • Или выполнить обратную пометкуотслеживание свойства навигации с атрибутом [IgnoreDataMember] для исключения свойства из сериализации
...