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 数据服务之间的区别

Ria 服务与 WCF 数据服务

.NET RIA 服务/WCF 服务

什么是 WCF RIA 服务?

如何为新的 Silverlight 应用程序在 WCF、REST、POX 和 RIA 服务之间进行选择

提交时可以编辑 WCF Ria 服务实体吗?