WCF / WCF Ria 服务在“IncludedResults”中返回关系数据
Posted
技术标签:
【中文标题】WCF / WCF Ria 服务在“IncludedResults”中返回关系数据【英文标题】:WCF / WCF Ria Service returns relational data in "IncludedResults" 【发布时间】:2019-11-24 20:48:26 【问题描述】:当我们在 Silverlight 应用程序中使用调用操作调用 WCF/WCF ria 服务时,它会返回正确的数据, 但是当我们以角度使用此服务或从邮递员调用它时,会返回 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();
实体框架元数据“author.metada.cs”-
[MetadataTypeAttribute(typeof(ViewAuthor.ViewAuthorMetadata))]
public partial class ViewAuthor
public string AUTOR_ID get; set;
....
....
[Include]
public EntityCollection<books> Books get; set;
....
....
来自“getauthors”API 的实际 JSON 响应 -
"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"
,
]
]
我需要与 SilverLight 应用程序相同的 JSON 响应,我做错了什么?请帮忙。
【问题讨论】:
【参考方案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,我们可以使用 DataContractSeriailizer 来简化序列化,请参考以下链接。https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contractshttps://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types 如果有什么可以帮助的,请随时告诉我。
【讨论】:
感谢您的回答@abraham Qian。我正在使用现有的 WCF ria 服务 API,直接使用具有导航属性的实体框架和 EF 的“包含”方法。 WCF ria 服务中没有写任何操作契约和数据契约,直接使用实体对象。这些 API 的响应与 SilverLight 应用程序一起正常工作。我正在使用那些现有的 API 开发有角度的电子应用程序。那么,我必须实现 DTO(数据传输对象)或 DataContract 以获得正确的 JSON 响应? 在我看来,数据响应的格式不满足你想要的规范,因为实体类的序列化和反序列化存在问题。另外,创建一个Restful风格的API可能会方便你项目的调用,所以我使用了webhttpbinding。 好的,非常感谢您的回复以及您给我宝贵的时间。谢谢。 您如何看待这个问题?您认为我们应该从哪方面着手来解决这个问题?对不起我的英语不好。没看清楚问题,想知道你们是怎么设计服务契约的,怎么在客户端调用服务和获取JSON数据。 其实我得出的结论是实体框架实体的序列化有问题。因此,我将创建一个单独的数据传输对象 (DTO) 类,该类具有与实体相似的属性。使用这些 DTO 来保存数据并在 API 的响应中返回,而不是实际的实体返回。也许它会起作用。以上是关于WCF / WCF Ria 服务在“IncludedResults”中返回关系数据的主要内容,如果未能解决你的问题,请参考以下文章
WCF 服务、WCF RIA 服务和 WCF 数据服务之间的区别