WCF REST JSON 返回动态列表

Posted

技术标签:

【中文标题】WCF REST JSON 返回动态列表【英文标题】:WCF REST JSON return dynamic list 【发布时间】:2019-04-04 12:15:39 【问题描述】:

如何返回包含动态列表的对象?

我有一个可用的 REST 服务,我想在其中返回 JSON 数据。 这在大多数情况下都非常有效 - 除了一种情况:

在这种特定情况下,我有一个List<Bla>,它可以包含BlaBla1(继承自Bla)类型的对象。 一旦我将Bla1 添加到列表中,我在浏览器中得到的结果就是一个错误。

Firefox: 跨域请求被阻止:同源策略不允许读取位于https://.../DoSomething 的远程资源。 (原因:CORS 请求未成功)。

Chrome: GET https://.../DoSomething net::ERR_SPDY_PROTOCOL_ERROR

如何返回包含动态列表的对象?

[DataContract]
public class Blibla

    [DataMember] public bool requestSuccess;
    [DataMember] List<Blubb> blubb;
    [DataMember] List<Bla> blas;

    public Blibla(bool success)
    
        this.requestSuccess = success;
        blubb = new List<Blubb>()  new Blubb(11, "einser"), new Blubb(22, "zweier"), new Blubb(33, "dreier") ;
        blas = new List<Bla>()  new Bla(11), new Bla1(22, 22) ;
    


[DataContract]
public class Bla

    [DataMember] public int id;

    public Bla(int id)
    
        this.id = id;
    


[DataContract]
public class Bla1 : Bla

    [DataMember] public int num;

    public Bla1(int id, int num) : base(id)
    
        this.num = num;
    



[DataContract]
public class Blubb

    [DataMember] public int ID;
    [DataMember] public string name;

    public Blubb(int id, string name)
    
        this.ID = id;
        this.name = name;
    

IService:

[Description("returns service's details")]
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
Blibla DoSomething();

服务:

public Blibla DoSomething()

    Message msg;
    DoHttpMethodTypeSpecific();

    Blibla bb = new Blibla(true);
    return bb;

编辑

Abraham Qian 的答案正是我想要的。 我的服务以正确序列化的Bla1-object 响应。


    "__type":"Bla1",
    "id":22,
    "num":22

如果有人知道一种方法来抑制自动添加的"__type":"Bla1" 请告诉我...

【问题讨论】:

【参考方案1】:

根据你的错误和代码,我做了测试,发现Bla类有序列化问题。在传递Bla类时,WCF无法识别子类(Bla1)以及如何序列化它们,所以我们应该在基类中添加KnowType属性。

[DataContract]
[KnownType(typeof(Bla1))]
public class Bla

    [DataMember] public int id;
    public Bla(int id)
    
        this.id = id;
    

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types

【讨论】:

尝试了您的解决方案,但不幸的是错误仍然存​​在。 很抱歉,因为我之前误解了您的问题,所以我给了一个错误的答复。我已经更新了我的答案。 完美。之前没听说过KnowType。有没有办法抑制添加的字段__type Bla1:#RFIDWebService.Lib?应该不会吧? 据我所知,我们可以使用 DataContract(DataMember) 属性方法来指定字段名称和命名空间。 [DataContract(Namespace ="",Name ="bla1")] 查看here 的__type 序列化。

以上是关于WCF REST JSON 返回动态列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF Web Api 大量返回动态类型/Expandos?

WCF 4.0 - 使用 REST 服务模板返回 JSON WebFaultException

当 url 段为 json 字符串时,访问 WCF Rest 服务 (WebGet) 时未找到 404

当我进行 Rest api 调用时,使用 Spring Boot 动态创建列/表

从 WCF REST Web 服务返回包装在回调函数中的 JSON

WCF REST:返回 JSON 或 XML 以供多个客户端访问?