WCF REST JSON 返回动态列表
Posted
技术标签:
【中文标题】WCF REST JSON 返回动态列表【英文标题】:WCF REST JSON return dynamic list 【发布时间】:2019-04-04 12:15:39 【问题描述】:如何返回包含动态列表的对象?
我有一个可用的 REST 服务,我想在其中返回 JSON 数据。 这在大多数情况下都非常有效 - 除了一种情况:
在这种特定情况下,我有一个List<Bla>
,它可以包含Bla
和Bla1
(继承自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 动态创建列/表