Служба WCF/WCF Ria возвращает реляционные данные в «IncludedResults»

Службы WCF/WCF ria возвращают правильные данные, когда мы вызываем их в приложении Silverlight с помощью вызова операции, но когда мы используем эту службу в angular или вызываем ее из почтальона, возвращаются реляционные данные вне RootResults с отдельными «IncludedResults».

Метод службы/API -

public IQueryable<viewauthor> getauthors(int author_id)
        {
            IQueryable<viewauthor> lstAuthor = null;
            lstAuthor = this.ObjectContext.books.Include("books").Where(p => p.author_id == author_id).AsQueryable();
            IEnumerable<viewauthor> lstResult = lstAuthor.ToList().Trim();
            return lstResult.AsQueryable();
        }

Метаданные Entity Framework «author.metada.cs» —

[MetadataTypeAttribute(typeof(ViewAuthor.ViewAuthorMetadata))]
    public partial class ViewAuthor
    {
    public string AUTOR_ID { get; set; }
    ....
    ....

    [Include]
    public EntityCollection<books> Books { get; set; }
    ....
    ....
    }

Фактический ответ JSON от API "getauthors" -

{
  "SelectDocDetailsByMattterIDResult": {
    "TotalCount": 1,
    "IncludedResults": [
      {
        "__type": "books:#library.Web.Data",
        "book_id": 1,
        "title": "Test book 1"
      },
      {
        "__type": "books:#library.Web.Data",
        "book_id": 2,
        "title": "Test book 2"
      },

    ],
    "RootResults": [
      {
        "author_id": 1,
        "ADD_TIME": "/Date(1559300437353+0530)/",
        "name": "test author"
      }
    ]
  }
}

Ожидаемый JSON-

{
  "SelectDocDetailsByMattterIDResult": {
    "TotalCount": 1,
    "RootResults": [
      {
        "author_id": 1,
        "ADD_TIME": "/Date(1559300437353+0530)/",
        "name": "test author",
        "books": [
          {
            "__type": "books:#library.Web.Data",
            "book_id": 1,
            "title": "Test book 1"
          },
          {
            "__type": "books:#library.Web.Data",
            "book_id": 2,
            "title": "Test book 2"
          },

        ]
      }
    ]
  }
}

Мне нужен тот же ответ JSON, что и у приложения SilverLight. Что я сделал не так? Пожалуйста помоги.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы определили интерфейс службы и какую привязку использует сервер? Пожалуйста, обратитесь к моему определению.

        [OperationContract]
        [WebInvoke(ResponseFormat =WebMessageFormat.Json,RequestFormat =WebMessageFormat.Json)]
        List<Product> SayHello();

    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public List<Animal> Animals { get; set; }


    }
    public class Animal
    {
        public int ID { get; set; }
        public string Name { get; set; }

}

Результат.

Кроме того, сериализатором по умолчанию является XMLSerializer, мы могли бы использовать DataContractSerializer для упрощения сериализации, см. ссылку ниже. https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contracts
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

Спасибо за ваш ответ @abraham Qian. Я использую существующий API службы WCF ria с прямым использованием инфраструктуры сущностей со свойством навигации и методом «включить» EF. В сервисах WCF ria нет никакого контракта операции и контракта данных, объект сущности используется напрямую. Эти ответы API правильно работают с приложением SilverLight. И я разрабатываю приложение Electron с угловым, используя существующие API. Итак, мне нужно реализовать DTO (объект передачи данных) или DataContract, чтобы получить правильный ответ JSON для этого?

Ravindra Vairagi 17.07.2019 07:45

На мой взгляд, формат ответа данных не соответствует требуемой спецификации, потому что есть проблема с сериализацией и десериализацией класса сущностей. Кроме того, создание API в стиле Restful может оказаться удобным для вызова вашего проекта, поэтому я использую webhttpbinding.

Abraham Qian 17.07.2019 08:06

Хорошо, очень благодарен за ваш ответ и за то, что уделили мне ваше драгоценное время. Спасибо.

Ravindra Vairagi 17.07.2019 08:27

Что вы думаете об этом вопросе? Как вы думаете, какой аспект мы должны взять на себя, чтобы решить эту проблему? Извините за мой плохой английский. Я не мог четко понять проблему, я хотел бы знать, как вы разрабатываете контракт на обслуживание и как вызывать службу и получать данные JSON на стороне клиента.

Abraham Qian 17.07.2019 08:55

Собственно, я пришел к выводу, что есть проблема с сериализацией сущностей фреймворка сущностей. Итак, я создам отдельный класс Data Transfer Object (DTO), который имеет аналогичные свойства как объект. Используйте эти DTO для хранения данных и возврата в ответ API вместо фактического возврата объекта. Может быть, это сработает.

Ravindra Vairagi 17.07.2019 09:05

Другие вопросы по теме