我不确定这是不是问题.
如果我在这里使用List,它在root/xml/metadata中都有效吗?op =竞赛和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; }
}
Run Code Online (Sandbox Code Playgroud)
HTTP/1.1 200 OK Content-Type:application/xml Content-Length: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>
Run Code Online (Sandbox Code Playgroud)
但如果我使用"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; }
}
Run Code Online (Sandbox Code Playgroud)
竞赛集合从元页面root/xml/metadata?op = Competitions中消失
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
Content-Type:application/xml Content-Length: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>
Run Code Online (Sandbox Code Playgroud)
ServiceStack 在底层使用 .NET 的 XML DataContractSerializer 来实现 XML 序列化,这就是您所看到的行为。它也适用于 POCO,即 [DataContract] 和 [DataMember] 属性是可选的。
也不建议在 DTO 上使用接口(IMO 没有充分的理由),它应该尽可能类型化和自描述。许多序列化不知道 IEnumerable 的具体类型应该是什么,因此必须进行一些修改,例如在有效负载中输出动态类型信息元数据,或者假设默认集合类型。
注意:如果您希望 XML 更漂亮,则应该为 DTO 定义命名空间 - 最好的方法是在AssemblyInfo.cs文件中定义程序集属性:
[assembly: ContractNamespace("http://schemas.servicestack.net/types",
ClrNamespace = "FSI.API.ServiceModel")]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |