响应类中的IEnumerable vs List,ServiceStack

时间:2012-02-10 14:11:22

标签: c# servicestack

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

如果我在这里使用List,它适用于root / xml / metadata?op =比赛和根/比赛

[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好的 Content-Type:application / xml 内容长度:长度

<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; }
}

比赛收集从元页面中消失 根/ XML /元数据?OP =竞赛

HTTP/1.1 200 OK

Content-Type:application / xml 内容长度:长度

<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>

1 个答案:

答案 0 :(得分:3)

ServiceStack使用.NET的XML DataContractSerializer来实现其XML序列化,这是您所看到的行为。它也适用于POCO,即[DataContract]和[DataMember]属性是可选的。

也不建议在DTO上使用接口(IMO没有充分的理由),这应该尽可能地打字和自我描述。许多序列化将不知道IEnumerable的具体类型应该是什么,因此必须执行一些黑客操作,例如有效负载中的输出动态typeinfo元数据,或者假设默认的集合类型。

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

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