【问题标题】:WCF REST JSON return dynamic listWCF REST JSON 返回动态列表
【发布时间】: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"
请告诉我...

【问题讨论】:

    标签: c# json list rest wcf


    【解决方案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 序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2011-08-27
    • 2011-09-09
    相关资源
    最近更新 更多