5

それが問題かどうかはわかりません。

ここでリストを使用すると、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 OKコンテンツタイプ: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; }
}

コンテストコレクションがメタページroot/xml / metadata?op=Competionsから消えました

HTTP/1.1 200 OK

コンテンツタイプ: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>
4

1 に答える 1

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")]
于 2012-02-10T17:34:11.637 に答える