【问题标题】:WCF / WCF Ria Service returns relational data in "IncludedResults"WCF / WCF Ria 服务在“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 响应,我做错了什么?请帮忙。

【问题讨论】:

    标签: c# json wcf silverlight ria


    【解决方案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-contracts
    https://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 的响应中返回,而不是实际的实体返回。也许它会起作用。
    猜你喜欢
    • 2011-04-22
    • 2012-01-14
    • 1970-01-01
    • 2011-01-29
    • 2011-03-02
    • 2011-07-14
    • 2011-12-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多