gpt4 book ai didi

c# - 响应类、ServiceStack 中的 IEnumerable 与列表

转载 作者:太空狗 更新时间:2023-10-29 23:33:36 26 4
gpt4 key购买 nike

我不确定这是否是一个问题。

如果我在这里使用 List,它在 root/xml/metadata?op=Competitions 和 root/Competitions 中都有效

[DataContract]
public class CompetitionsResponse : IHasResponseStatus
{
[DataMember]

public List<Competitions> Competitions { get; set; }

//Auto inject and serialize web service exceptions
[DataMember]
public ResponseStatus ResponseStatus { get; set; }
}

HTTP/1.1 200 正常内容类型:应用程序/xmlContent-Length:长度

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel">
<Competitions>
<Competitions>
<CompName>String</CompName>
<CompType>String</CompType>
<CompetitionID>0</CompetitionID>
</Competitions>
</Competitions>
<ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types">
<d2p1:ErrorCode>String</d2p1:ErrorCode>
<d2p1:Errors>
<d2p1:ResponseError>
<d2p1:ErrorCode>String</d2p1:ErrorCode>
<d2p1:FieldName>String</d2p1:FieldName>
<d2p1:Message>String</d2p1:Message>
</d2p1:ResponseError>
</d2p1:Errors>
<d2p1:Message>String</d2p1:Message>
<d2p1:StackTrace>String</d2p1:StackTrace>
</ResponseStatus>
</CompetitionsResponse>

但是如果我使用“IEnumerable”

[DataContract]
public class CompetitionsResponse : IHasResponseStatus
{
[DataMember]
public IEnumerable<Competitions> Competitions { get; set; }

//Auto inject and serialize web service exceptions
[DataMember]
public ResponseStatus ResponseStatus { get; set; }
}

竞赛收藏从元页面中消失root/xml/metadata?op=竞赛

HTTP/1.1 200 OK

内容类型:application/xmlContent-Length:长度

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel">
<Competitions i:nil="true" />
<ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types">
<d2p1:ErrorCode>String</d2p1:ErrorCode>
<d2p1:Errors>
<d2p1:ResponseError>
<d2p1:ErrorCode>String</d2p1:ErrorCode>
<d2p1:FieldName>String</d2p1:FieldName>
<d2p1:Message>String</d2p1:Message>
</d2p1:ResponseError>
</d2p1:Errors>
<d2p1:Message>String</d2p1:Message>
<d2p1:StackTrace>String</d2p1:StackTrace>
</ResponseStatus>
</CompetitionsResponse>

最佳答案

ServiceStack 在底层使用 .NET 的 XML DataContractSerializer 进行 XML 序列化,这就是您所看到的行为。它还适用于 POCO,即 [DataContract] 和 [DataMember] 属性是可选的。

也不建议在 DTO 上使用接口(interface)(IMO 没有充分的理由这样做),它应该尽可能地类型化和 self 描述。许多序列化不知道 IEnumerable 的具体类型应该是什么,因此必须做一些 hack,比如在有效负载中输出动态类型信息元数据,或者假定默认集合类型。

注意:如果您希望 XML 比您应该为 DTO 定义命名空间更漂亮 - 最好的方法是在您的 AssemblyInfo.cs 文件中定义一个程序集属性:

[assembly: ContractNamespace("http://schemas.servicestack.net/types",  
ClrNamespace = "FSI.API.ServiceModel")]

关于c# - 响应类、ServiceStack 中的 IEnumerable 与列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com