Службы 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. Что я сделал не так? Пожалуйста помоги.





Как вы определили интерфейс службы и какую привязку использует сервер? Пожалуйста, обратитесь к моему определению.
[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
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.
На мой взгляд, формат ответа данных не соответствует требуемой спецификации, потому что есть проблема с сериализацией и десериализацией класса сущностей. Кроме того, создание API в стиле Restful может оказаться удобным для вызова вашего проекта, поэтому я использую webhttpbinding.
Хорошо, очень благодарен за ваш ответ и за то, что уделили мне ваше драгоценное время. Спасибо.
Что вы думаете об этом вопросе? Как вы думаете, какой аспект мы должны взять на себя, чтобы решить эту проблему? Извините за мой плохой английский. Я не мог четко понять проблему, я хотел бы знать, как вы разрабатываете контракт на обслуживание и как вызывать службу и получать данные JSON на стороне клиента.
Собственно, я пришел к выводу, что есть проблема с сериализацией сущностей фреймворка сущностей. Итак, я создам отдельный класс Data Transfer Object (DTO), который имеет аналогичные свойства как объект. Используйте эти DTO для хранения данных и возврата в ответ API вместо фактического возврата объекта. Может быть, это сработает.
Спасибо за ваш ответ @abraham Qian. Я использую существующий API службы WCF ria с прямым использованием инфраструктуры сущностей со свойством навигации и методом «включить» EF. В сервисах WCF ria нет никакого контракта операции и контракта данных, объект сущности используется напрямую. Эти ответы API правильно работают с приложением SilverLight. И я разрабатываю приложение Electron с угловым, используя существующие API. Итак, мне нужно реализовать DTO (объект передачи данных) или DataContract, чтобы получить правильный ответ JSON для этого?